Text-Processing

如何在 .csv 文件中找到最常用的單詞,而忽略每一行的重複項?

  • July 4, 2020

我需要在 .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

  • 使用uniqfromList::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

但是請參閱為什麼使用 shell 循環處理文本被認為是不好的做法?

使用 GNUgrep或兼容:

$ 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

引用自:https://unix.stackexchange.com/questions/590303