このawk
解決策はあなたのために働くかもしれません:
awk '/^[0-9]:[0-9]\.[0-9]/{
if (pass_num) printf "%s, word count: %i\n", pass_num, word_count
pass_num=$1
word_count=-1
}
{ word_count+=NF }
END { printf "%s, word count: %i\n", pass_num, word_count }
' file
テスト入力:
# cat file
0:1.1 I am le passage one.
There are many words in me.
0:1.2 I am le passage two.
One two three four five six
Seven
0:1.3 I am "Hello world"
テスト出力:
0:1.1, word count: 11
0:1.2, word count: 12
0:1.3, word count: 4
使い方:
各単語は空のスペースで区切られているため、各単語はの各フィールドで表すことができますawk
。つまり、1行の単語数はに等しくなりNF
ます。単語数は、次のパッセージまですべての行に合計されます。
新しいパッセージ(パッセージ番号の存在によって示される)に遭遇すると、
- 前のパッセージの数と単語数を出力します。
- パッセージ番号をこの新しいパッセージ番号に設定します
- パッセージの単語数をリセットします(
-1
パッセージ番号をカウントしたくないため)
最後のEND{..}
パッセージにはパッセージ番号と単語数を出力するトリガーがないため、ブロックが必要です。
最初のパッセージに遭遇したときif (pass_num)
に抑制することです。printf
awk