awkスクリプトを使用して部分文字列を含むファイルのフィールド数を数える方法は?

awkスクリプトを使用して部分文字列を含むファイルのフィールド数を数える方法は?

たとえば、テキスト文書があります。

"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 }`

おすすめ記事