GNU/Linux >> Znalost Linux >  >> Linux

Jak najít nejfrekventovanější slovo v souboru .csv, ignorovat duplikáty na každém řádku?

Potřebuji najít 10 nejčastějších slov v souboru .csv.
Soubor je strukturován tak, že každý řádek obsahuje slova oddělená čárkami. Pokud se stejné slovo opakuje na stejném řádku více než jednou, mělo by se počítat jako jedno.
V příkladu níže:

green,blue,blue,yellow,red,yellow
red,blue,green,green,green,brown

zelená, modrá a červená by se měla počítat jako 2 a žlutá a hnědá jako 1

Vím, že podobné otázky již byly položeny a jedno řešení bylo:

<file.csv tr -c '[:alnum:]' '[\n*]' | sort|uniq -c|sort -nr|head  -10

Ale toto bude počítat, kolikrát se slovo objeví na stejném řádku, jako je toto:

  4 green
  3 blue
  2 yellow
  2 red
  1 brown

a to ve skutečnosti není to, co potřebuji.
Nějaká pomoc? Také ocením krátké vysvětlení příkazu a proč příkaz, který jsem našel v podobných otázkách, nedělá to, co potřebuji.

Přijatá odpověď:

Asi bych sáhl po perlu

  • Použijte uniq z List::Util modul pro deduplikaci každého řádku.
  • K počítání výsledných výskytů použijte hash.

Například

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

Pokud nemáte jinou možnost než sort a uniq coreutils, pak můžete implementovat podobný algoritmus s přidáním shell loop

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

viz Proč je používání shellové smyčky ke zpracování textu považováno za špatný postup?


Linux
  1. Jak vložit text na začátek každého řádku ve Vimu

  2. Najít N nejfrekventovanějších slov v souboru se seznamem stop slov z příkazového řádku?

  3. Jak zjistit typ souboru Img a připojit jej?

  1. Jak rozdělit soubor a zachovat první řádek v každém z kusů?

  2. jak najít vlastníka souboru nebo adresáře v pythonu

  3. Jak v Bash přidám řetězec za každý řádek v souboru?

  1. Jak najít nejstarší soubor ve stromu adresářů v Linuxu

  2. Jak mohu vytvořit soubor v každé složce?

  3. Jak najít index slova v řetězci v bash?