たとえば、テキストドキュメントがあります:
"Hello, I am the janitor and I have a headache The rabbit jumped over the red brick wall"
カウントしたい部分文字列「he」が出現するフィールドの数。ファイル内の「彼」の数は数えたくありません。フィールドの数だけを数えます。
したがって、私の例では、次のように出力する必要があります。
Number of fields that contain "he" in record #1: 3 Number of fields that contain "he" in record #2: 2
これはawkスクリプトである必要があります。
コメント
- これまでに何を試しましたか?
- 次のスクリプトを試しました:" {print "レコード内のフィールド数#" NR "を含む' he ':" index($ 0、" he ")}であり、'は機能しません。 gsubも試しましたが、gsubは、iv id = “e1168a2e1b”が含まれるフィールドだけでなく、'彼'のすべての出現をカウントします。 >
he 'が見つかりました。
回答
フィールドには1
およびNF
それらの数が含まれています。したがって、ループ内で問題のフィールドを参照する$i
を使用して、for (i = 1; i <= NF; i++) { ... }
でそれらを反復処理できます。 (i
は実際にはフィールドの番号にすぎません。フィールドの実際の内容を取得するには、$
演算子が必要です。)
値に特定の部分文字列が含まれているかどうかを確認するには、正規表現を使用するのが最も簡単です。 s ~ /foo/
は、変数s
が文字列foo
と一致するかどうか、つまり、部分文字列として。ここで、大文字にも一致させることができます。その場合、たとえば、 [Ff]
は、f
の代わりに機能します。角かっこグループ[...]
は、内部の文字のいずれかに一致します。
もちろん、カウンターも必要ですが、それは簡単です。変数を初期化するだけです。ループの前にゼロに設定し(例: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 }`
コメント
- 完全なスクリプトファイルとしてはどのように見えますか?I mは完全に失われました。私たちの教授は'このことについて話しませんでした。
- @JohnMike、まあ、それは'だけです。 、宿題の完全な答えを出すのは本当に嫌いです。ただし、それらから何かを構築しようとする時間があれば、これですべての部分になります。
- 私は' tしませんが、通常は'完全な答えを求めることはありませんが、このクラスでAを取得することを心配しています。私は'ストレートAの学生で、通常は私の計算機科学のクラスに問題はありませんが、この教授はクラス外の知識を期待していることで有名です。私は'これまでunix / linuxを使用したことがなく、ここで本当に苦労しています。宿題は20の問題で構成されており、これらの3つと私が作成した別の投稿の2つだけが、私が理解できない問題です。時間が足りなくなったので、'明日までに締め切ります。
- @JohnMike、いくつかのピースをまとめることができるかどうか試してみてください。SEは、インタラクティブな前後のデバッグには向いていませんが、Qを編集して、1、2ステップ進んだらスクリプトを追加できます。そうすれば、'が何であるかを確認できます。 ストッパー
- @JohnMike(a)forループを使用して各レコードのフィールドを反復処理するためにここに示す方法、(b)
gsub
で試したことを考慮して 放棄された投稿は、実行するターゲットを受け入れることができます。つまり、gsub("he","",$i)
(c)基本的な計算機科学のバックグラウンドがあります(d)tutorialspoint.com/execute_bash_online.php を使用すると、PCにLinuxがない場合でも宿題を作成できます。ここに記載されているヘルプを使用して、宿題を解決しようとしない強い言い訳はありません。 少なくとも試してみると、ヘルプが届きます。
回答
以下の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