awkは、連続した2つの単語の最も一般的なシーケンスを探します。

awkは、連続した2つの単語の最も一般的なシーケンスを探します。

「ファイル」というテキストファイルがあります。 「this is」と「is this」が等しいと見なされる最も一般的な2つの単語シーケンスを見つけるには、awkを使用する必要があります。

テキスト例:私の名前はで、これは次のテキストです。

期待される出力: 3 か。

私はこのループを使用しました:

awk 'BEGIN{
    for(i=1;i<NF;i++) 
    a[$i OFS $(i+1)]++
    }' file

なぜこれが失敗するのか知っている人はいますか?

ベストアンサー1

ファイルを読み取らないため、コードは失敗します。特殊BEGINブロックが実行されます。今後コマンドラインに名前が付けられた最初の入力ファイルも読み取り用に開きます(END最後のファイルの次のブロックも同じです)。また、コードの出力はありません。

他のユーザーはすでに独自のソリューションを提供しているので、コードをインポートして少し修正します。

  1. 入力の各行に対して実行されるように、通常のブロックでコードを実行します。
  2. ブロックを使用してEND配列内で最も一般的な単語の組み合わせを見つけ、すべての入力が処理された後に出力します。
  3. 各ペアの単語が常にアルファベット順に使用されていることを確認してください。
awk '
    {
        for (i = 1; i < NF; i++)
            if ($i < $(i+1)) a[$i OFS $(i+1)]++
            else             a[$(i+1) OFS $i]++
    }
    END {
        for (words in a)
            if (a[words] > a[m]) m = words
        print m, a[m]
    }' file

与えられた入力に従って印刷されますis this 3

別の実装は、ファイルの読み取り中に最大値を追跡し、最後に印刷することです。

awk '
    {
        for (i = 1; i < NF; ++i) {
            if ($i < $(i+1)) words = $i OFS $(i+1)
            else             words = $(i+1) OFS $i
            if (++count[words] > count[m]) m = words
        }
    }
    END { print m, count[m] }' file

配列について心配しないでください。

awk '{ for (i = 1; i < NF; ++i) if ($i < $(i+1)) print $i, $(i+1); else print $(i+1), $i }' file | sort | uniq -c | sort -n | tail -n 1

つまり、awk単語の組み合わせを生成(1行に1つずつ)を使用してソートし、それぞれの発生回数を取得してソートします。これら(数に基づいて)最も高い数を選択してください。大きなデータを呼び出してsort電子メールなどの小さなデータを実行するのは高価ですが、十分です。

おすすめ記事