GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie finde ich das häufigste Wort in einer .csv-Datei und ignoriere Duplikate in jeder Zeile?

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 aus List::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?


Linux
  1. Wie kann man die Zeilen einer Datei durchlaufen?

  2. Wie finde ich den Typ einer Img-Datei und mounte sie?

  3. Wie analysiert man jede Zeile einer Textdatei als Argument für einen Befehl?

  4. Wie kann ich in jedem Ordner eine Datei erstellen?

  5. Wie kann ich dem Anfang jeder Zeile in einer Datei eine Zeichenfolge voranstellen?

So finden Sie die älteste Datei in einem Verzeichnisbaum in Linux

So finden Sie die längste(n) Zeile(n) in einer Datei in Linux

So beheben Sie die grüne Linie unten in VLC unter Linux

Wie finde ich den my.cnf-Speicherort von MySQL?

So kombinieren Sie den Befehl „tar“ mit „find“

Wie finde ich die älteste Datei in einem Verzeichnisbaum?