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