confuso sobre scripts awk

confuso sobre scripts awk

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

tarefa1

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 awkcomo 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 FSem um BEGINbloco.

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 awkscript, mas o colocou em um script. Este é o seu awkroteiro:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}

Salve-o em um arquivo script.awke execute como

awk -F',' -f script.awk inputfile

Agora algumas dicas sobre o seu script:

awkos comandos se parecem com CONDITION {COMMAND(S)}. Se CONDITIONfor 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 CONDITIONque for atendido.

No seu caso:

  1. /./é uma regex que combina linhas com qualquer caractere... então todas as linhas, exceto linhas vazias - é praticamente redundante, como condição

  2. Você usa " "como separador entre as variáveis, usa ,para aplicar o valor padrão

  3. Você precisará fornecer using ,como separador no script em um BEGINbloco 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:

  1. 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.

  2. 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.

informação relacionada