GNU/Linux >> Linux の 問題 >  >> Linux

各行の重複を無視して、.csvファイルで最も頻繁に使用される単語を見つける方法は?

.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

ただし、テキストを処理するためにシェルループを使用するのはなぜ悪い習慣と見なされるのかを参照してください。


Linux
  1. ファイルの行をループする方法は?

  2. コマンドラインからストップワードリストを含むファイルで最も頻繁に使用されるN個の単語を検索しますか?

  3. Imgファイルのタイプを見つけてマウントする方法は?

  1. ファイルを分割し、各部分の最初の行を保持する方法は?

  2. Python でファイルまたはディレクトリの所有者を見つける方法

  3. Bash で、ファイルの各行の後に文字列を追加するにはどうすればよいですか?

  1. 各フォルダにファイルを作成するにはどうすればよいですか?

  2. ファイルの各行の先頭に文字列を追加するにはどうすればよいですか?

  3. bashで文字列内の単語のインデックスを見つける方法は?