as instruções indicam que seu arquivo de script será testado em nosso sistema com o seguinte comando:
awk -f ./awk4.awk input.csv
Escreva um script awk que aceite o seguinte arquivo e produza os campos de nome e nota
aparentemente, criei um script bash e precisa ser um script awk que será executado com awk -f na linha de comando. abaixo está o meu código. existe uma maneira fácil de converter meus scripts bash em scripts awk sem ter que refazer tudo? realmente confuso sobre as direções.
#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' $1
Responder1
Em um script awk, o conteúdo é o que você forneceria awk
como comandos. Então, neste caso, é:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
No entanto, isso tornará seu uso complicado, -F ,
portanto, defina-o FS
em um BEGIN
bloco.
Então seu script seria:
#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Responder2
Você escreveu um awk
script, mas o colocou em um script. Este é o seu awk
roteiro:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Salve-o em um arquivo script.awk
e execute como
awk -F',' -f script.awk inputfile
Agora algumas dicas sobre o seu script:
awk
os comandos se parecem com CONDITION {COMMAND(S)}
. Se CONDITION
for cumprido para uma linha (registro), {COMMAND(S)}
é/são executados. Se não houver CONDITION
, {COMMAND(S)}
é/são executado para todos os registros; se não houver {COMMAND(S)}
, o registro é impresso apenas sempre CONDITION
que for atendido.
No seu caso:
/./
é uma regex que combina linhas com qualquer caractere... então todas as linhas, exceto linhas vazias - é praticamente redundante, como condiçãoVocê usa
" "
como separador entre as variáveis, usa,
para aplicar o valor padrãoVocê precisará fornecer using
,
como separador no script em umBEGIN
bloco inicial.
BEGIN {FS=","}
{print $1,$2}
Se você também quiser usar vírgula como separador de saída, use:
BEGIN {FS=OFS=","}
{print $1,$2}
Responder3
Um script awk é apenas uma coleção de comandos awk que podem ser executados pelo awk
. Existem duas maneiras de escrever um script awk:
Basta escrever os comandos awk em um arquivo de texto e chamar com
awk -f /path/to/file.awk
. No seu caso, seria:/./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
E você executaria como:
awk -F, -f /path/to/file.awk inputFile
Ou, se precisar que seja executado apenas com
awk -f ./path/to/file.awk inputFile
, sem-F,
então definir o separador de campos no próprio script:BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
E então corra com
awk -f /path/to/file.awk inputFile
.Escreva os comandos, mas use o shebang para especificar qual intérprete deve ler o script. No seu caso, ficaria assim:
#!/usr/bin/awk -f ## With this approach, you can't use -F so you need to set ## the field separator in a BEGIN{} block. BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
E você tornaria o script executável (
chmod a+x /path/to/file.awk
) e executaria assim:/path/to/file.awk inputFile
Ambos são scripts awk. A terceira opção é escrever umconchascript em vez disso e faça com que o shell script execute o awk. Isso ficaria assim:
#!/bin/sh
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' "$1"
O que você tinha não era uma coisa nem outra: você estava usando um awk shebang, mas tinha um script de shell em vez de um script awk.