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
zList::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?