.csvファイルで最も頻繁に使用される10個の単語を見つける必要があります。
ファイルは、各行にコンマ区切りの単語が含まれるように構成されています。同じ単語が同じ行で複数回繰り返される場合は、1つとしてカウントする必要があります。
したがって、以下の例では:
green,blue,blue,yellow,red,yellow
red,blue,green,green,green,brown
緑、青、赤は2として数え、黄色と茶色は1として数える必要があります
以前にも同様の質問があったことは知っていますが、解決策の1つは次のとおりです。
<file.csv tr -c '[:alnum:]' '[\n*]' | sort|uniq -c|sort -nr|head -10
ただし、これは、次のように、単語が同じ行に表示される回数をカウントします。
4 green
3 blue
2 yellow
2 red
1 brown
これは実際には私が必要としているものではありません。
何か助けはありますか?また、コマンドの簡単な説明と、同様の質問で見つけたコマンドが必要な機能を実行しないのはなぜですか。
承認された回答:
私はおそらくperlに手を伸ばすでしょう
-
uniq
を使用するList::Util
から 各行を重複排除するモジュール。 - ハッシュを使用して、結果の発生をカウントします。
例
perl -MList::Util=uniq -F, -lnE '
map { $h{$_}++ } uniq @F
}{
foreach $k (sort { $h{$b} <=> $h{$a} } keys %h) {say "$h{$k}: $k"}
' file.csv
2: red
2: green
2: blue
1: yellow
1: brown
sort
以外のオプションがない場合 およびuniq
coreutilsの場合、シェルループを追加して同様のアルゴリズムを実装できます
while IFS=, read -a words; do
printf '%s\n' "${words[@]}" | sort -u
done < file.csv | sort | uniq -c | sort -rn
2 red
2 green
2 blue
1 yellow
1 brown
ただし、テキストを処理するためにシェルループを使用するのはなぜ悪い習慣と見なされるのかを参照してください。