Text-Processing
如何在 .csv 文件中找到最常用的單詞,而忽略每一行的重複項?
我需要在 .csv 文件中找到 10 個最常用的單詞。該文件的結構使得每一行都包含逗號分隔的單詞。如果同一單詞在同一行中重複多次,則應計為一個。因此,在下面的範例中:
green,blue,blue,yellow,red,yellow red,blue,green,green,green,brown
綠色、藍色和紅色應計為 2,黃色和棕色應計為 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
fromList::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
如果除了和coreutils之外別無選擇uniq
,那麼您可以通過添加一個 shell 循環來實現類似的算法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
使用 GNU
grep
或兼容:$ grep -nEo '\w+' file.csv|sort -u|cut -d: -f2-|sort|uniq -c|sort -k1rn|head 2 blue 2 green 2 red 1 brown 1 yellow