「ファイル」というテキストファイルがあります。 「this is」と「is this」が等しいと見なされる最も一般的な2つの単語シーケンスを見つけるには、awkを使用する必要があります。
テキスト例:私の名前はで、これは次のテキストです。
期待される出力: 3 か。
私はこのループを使用しました:
awk 'BEGIN{
for(i=1;i<NF;i++)
a[$i OFS $(i+1)]++
}' file
なぜこれが失敗するのか知っている人はいますか?
ベストアンサー1
ファイルを読み取らないため、コードは失敗します。特殊BEGIN
ブロックが実行されます。今後コマンドラインに名前が付けられた最初の入力ファイルも読み取り用に開きます(END
最後のファイルの次のブロックも同じです)。また、コードの出力はありません。
他のユーザーはすでに独自のソリューションを提供しているので、コードをインポートして少し修正します。
- 入力の各行に対して実行されるように、通常のブロックでコードを実行します。
- ブロックを使用して
END
配列内で最も一般的な単語の組み合わせを見つけ、すべての入力が処理された後に出力します。 - 各ペアの単語が常にアルファベット順に使用されていることを確認してください。
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
電子メールなどの小さなデータを実行するのは高価ですが、十分です。