awkコマンドを使用して、私が作成したファイルの後に行3-5を表示し、出力行の前に行番号を表示したいと思います(例:行3:)。また、3行すべての単語の総数を表示したいと思います。私のコードは以下に提供されています。 「%s」に関するエラーメッセージは引き続き表示されますが、ここでどこに行くのかわかりません。助けが必要ですか?
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 }
入力ファイルは次のとおりです。
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!
私が得た結果は次のとおりです。
(FILENAME=presents FNR=3) fatal: not enough arguments to satisfy format string
`%d: %s '
^ ran out for this one
ベストアンサー1
コードエラー部分
重要な問題は、型がありますが、型指定子と一致する可能性のある引数はmatchですが、matchではなく%d: %s
1つの引数しか一致できないことです。$i
$i
%d
%s
スクリプトを次のように変更した場合:
#!/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 }
これによりエラーはなく、次の出力が生成されます。
$ ./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 >>
目的の動作に合わせてコードを変更する
しかし、あなたの説明は次のとおりです。
私が作成したファイルの後に行3-5を表示し、出力行の前に行番号も表示したいと思います(例:行3:)。
これは、forループを使用して各フィールドを処理する前に行番号を出力する必要があることを意味します。
#!/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 }
仕組みは次のとおりです。
$ ./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 >>