たとえば、テキスト文書があります。
"Hello, I am the janitor and I have a headache
The rabbit jumped over the red brick wall"
部分文字列"he"が現れるフィールドの数を計算したいと思います。ファイルの「his」数を数えるのではなく、フィールド数だけを計算したいと思います。
私の例では、次のように印刷する必要があります。
Number of fields that contain 'he' in record #1: 3
Number of fields that contain 'he' in record #2: 2
awkスクリプトでなければなりません。
答え1
フィールドには最初から番号が付けられ、1
フィールドNF
数が含まれます。したがって、を使用してこれを繰り返し、for (i = 1; i <= NF; i++) { ... }
ループ$i
内の関連フィールドを参照できます。 (i
実際にはフィールド番号にすぎず、$
フィールドの実際の内容を取得するには演算子が必要です。)
値に特定の部分文字列が含まれていることを確認するには、正規表現を使用するのが最も簡単です。変数がs ~ /foo/
どこでもs
文字列と一致するかfoo
、つまり変数が部分文字列として含まれていることを確認します。これで大文字を一致させることもできます。この場合、egを[Ff]
代わりに使用できますf
。角かっこグループは、対応する[...]
文字の1つと一致します。
もちろん、カウンタも必要ですが、これはループの前に変数をゼロに初期化し(たとえば)、一致するものがあればそれをインクリメントcount=0
するのと同じくらい簡単です(count += 1
)。
~~
したがって、デフォルトでは、ファイルの各行/レコードに対していくつかのコードを実行するawkスクリプトは次のようになります。
awk '{ some code }' < filename.txt
コードブロック内でfor
ループがフィットし、中かっこ内のブロックも必要です{ .. }
。
awk '{ for ( ... ) { some code } }`
そしてif
同様の作品、
if (condition) { some code... }
(実際にはCでは、for
のように見えますif
。)
そして、セミコロンを使用して文を区別することができます。
awk '{ what to do before the loop; for ( ... ) { some code }; what to do after }`
答え2
次のawkスクリプトで完了
awk -v i="he" '{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}' file
出力
Number of fields that contain he 3 in record 1
Number of fields that contain he 2 in record 2