Ich muss die 10 häufigsten Wörter in einer .csv-Datei finden.
Die Datei ist so strukturiert, dass jede Zeile durch Kommas getrennte Wörter enthält. Wenn dasselbe Wort mehr als einmal in derselben Zeile wiederholt wird, sollte es als eins gezählt werden.
Also im Beispiel unten:
green,blue,blue,yellow,red,yellow
red,blue,green,green,green,brown
Grün, Blau und Rot sollten als 2 und Gelb und Braun als 1 gezählt werden
Ich weiß, dass ähnliche Fragen schon einmal gestellt wurden, und eine Lösung war:
<file.csv tr -c '[:alnum:]' '[\n*]' | sort|uniq -c|sort -nr|head -10
Aber dies zählt, wie oft ein Wort in derselben Zeile vorkommt, etwa so:
4 green
3 blue
2 yellow
2 red
1 brown
und das ist eigentlich nicht das, was ich brauche.
Irgendwelche Hilfe? Ich würde auch eine kurze Erklärung des Befehls zu schätzen wissen und erklären, warum der Befehl, den ich in ähnlichen Fragen gefunden habe, nicht das tut, was ich brauche.
Akzeptierte Antwort:
Ich würde wahrscheinlich nach Perl greifen
- Verwenden Sie
uniq
ausList::Util
Modul, um jede Zeile zu deduplizieren. - Verwenden Sie einen Hash, um die resultierenden Vorkommen zu zählen.
Zum Beispiel
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
Wenn Sie keine andere Option haben als sort
und uniq
coreutils, dann können Sie einen ähnlichen Algorithmus implementieren, indem Sie eine Shell-Schleife hinzufügen
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
siehe jedoch Warum wird die Verwendung einer Shell-Schleife zur Verarbeitung von Text als schlechte Praxis angesehen?