Awk: Imprime linhas para trás com número de linha e contagem de palavras

0

Usando o comando awk, devo exibir as linhas 3-5 de trás de um arquivo que eu criei e antes da linha de saída, o número da linha deve ser exibido (isto é, linha 3 :). Também devo exibir o total de contagens de palavras de todas as três linhas. Meu código é fornecido abaixo. Eu continuo recebendo uma mensagem de erro para o '% s' e não tenho certeza de onde ir a partir daqui, alguma ajuda?

BEGIN { print("<< Start of file >>"); }

NR>=3 && NR<=5 { for (i = NF; i >= 1; i--)

                printf "%d: %s ", $i;
                print ""
                wordCount += NF;


}



END { printf "<< End of file: wordCount = %d >>\n", wordCount }

Aqui está o arquivo de entrada:

Gimme presents I want more!
Gimme presents, I did my chores!
A bicycle, a tricycle, a motor vehicle!
I deserve it, you reverse it!
Gimme presents; more, more, more
Gimme presents I need more!

E a saída que obtenho é:

(FILENAME=presents FNR=3) fatal: not enough arguments to satisfy format string
        '%d: %s '
             ^ ran out for this one
    
por Herman 09.02.2018 / 01:02

1 resposta

1

Parte do bug de código

O principal problema é que você tem %d: %s format, mas há apenas um argumento $i para corresponder ao formato speficiers, ou seja, $i corresponde a %d , mas não a %s .

Depois de alterar o script da seguinte forma:

#!/usr/bin/awk -f

BEGIN { print("<< Start of file >>"); }

NR>=3 && NR<=5 { 
    for (i = NF; i >= 1; i--)
        printf "%d: %s ", i,$i;
    print ""
    wordCount += NF;


}

END { printf "<< End of file: wordCount = %d >>\n", wordCount }

Depois, não há erro e produz a saída da seguinte forma:

$ ./awk_script.awk input.txt
<< Start of file >>
7: vehicle! 6: motor 5: a 4: tricycle, 3: a 2: bicycle, 1: A 
6: it! 5: reverse 4: you 3: it, 2: deserve 1: I 
5: more 4: more, 3: more, 2: presents; 1: Gimme 
<< End of file: wordCount = 18 >>

Corrigindo o código para corresponder ao comportamento desejado

No entanto, sua descrição foi:

I am to display lines 3-5 backwards of a file i have created and before the outputted line, the line number is to be displayed (i.e. line 3:)

Isso significa que antes de processar cada campo usando for-loop, você precisa enviar o número da linha primeiro:

#!/usr/bin/awk -f

BEGIN { print("<< Start of file >>"); }

NR>=3 && NR<=5 {
    printf "line %d:",NR; # display line number first
    for (i = NF; i >= 1; i--)
        printf " %s ", $i;
    print ""; 
    wordCount += NF;

}

END { printf "<< End of file: wordCount = %d >>\n", wordCount }

Que funciona assim:

$ ./awk_script.awk input.txt
<< Start of file >>
line 3: vehicle!  motor  a  tricycle,  a  bicycle,  A 
line 4: it!  reverse  you  it,  deserve  I 
line 5: more  more,  more,  presents;  Gimme 
<< End of file: wordCount = 18 >>
    
por 09.02.2018 / 01:28