txtファイルの各単語数を数えようとしています。
ワード.txt
the day is sunny the the
the sunny is is
予想される結果:
the 4
is 3
sunny 2
day 1
欲しい
1) すべてのスペースを新しい行に置き換えます。
awk -v RS=" " '{print}' words.txt
結果
the
day
is
sunny
the
the
the
sunny
is
is
#empty line
2) 空白行の削除
awk 'NF>0 {print}' words.txt |sort | uniq -c |sort -bnr
結果
1 the sunny is is
1 the day is sunny the the
上記の2つのスクリプトを1行のコードにまとめて期待した結果を生成するにはどうすればよいですか?
答え1
特に、ジョブを単一のスクリプトに結合したい場合は、スペースを改行などに変更してテキストを前処理する必要はありませんawk
。
$ awk '{ for (i=1; i<=NF; ++i) count[$i]++ } END { for (word in count) print count[word], word }' file
4 the
2 sunny
3 is
1 day
スペースで区切られた各単語を見て数を数えます。数はcount
単語でインデックス付けされた配列に格納されます。最後に、数と対応する単語が出力されます。空行には単語が含まれていないため、自動的にスキップされます。
これを揃える必要がある場合は、パイプで接続してくださいsort -n
。
GNUを使用している場合は、awk
そのasorti()
機能を使用してブロック単位でソートできますEND
。
END {
n = asorti(count, c2, "@val_num_desc")
for (i=1; i<=n; i++ )
printf("%d %s %s\n", i, count[c2[i]], c2[i])
}
答え2
@Kusalanandaはすでに良いawkソリューションを提供していますが、以下も提供しました。
$ tr ' ' '\n' < file | sort | uniq -c
1 day
3 is
2 sunny
4 the
答え3
GNU grepがある場合は、-o
(--only-matching
)オプションを使用して1行に1つの一致を表示できます。
grep -o '\S\+' words.txt
sort
次に、以前のようにandにパイプしますuniq
。