awkスクリプトを使用して、部分文字列がファイル内にあるフィールドの数をカウントするにはどうすればよいですか?

たとえば、テキストドキュメントがあります:

"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 'が見つかりました。

  • フィールドを反復処理する必要があります。 これは役立つはずです。
  • unix.stackexchange.com/questionsを放棄しましたか/ 550529 / …
  • @JohnMikeまた、&の結果を入力してくださいあなたの質問に。'見落とされません。
  • 回答

    フィールドには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のforifのように。)

    セミコロンを使用してステートメントを区切ることができるので、

    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 

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です