Ich habe tabulatorgetrennte Dateien mit mehreren Spalten. Ich möchte die Häufigkeit des Auftretens der verschiedenen Werte in einer Spalte für alle Dateien in einem Ordner zählen und sie in absteigender Reihenfolge sortieren (höchste Anzahl zuerst). Wie würde ich dies in einer Linux-Befehlszeilenumgebung erreichen?
Es kann jede gängige Befehlszeilensprache wie awk, perl, python usw. verwenden.
bash
command-line
frequency
sfactor
quelle
quelle
-d,
zum Trennen von Feldern durch Komma oder ein anderes Trennzeichen).cut -f 1 -d ' '
. Vielen Dank. :)Die GNU-Site schlägt dieses nette awk-Skript vor, das sowohl die Wörter als auch ihre Häufigkeit druckt.
Mögliche Änderungen:
sort -nr
(und umkehrenword
undfreq[word]
), um das Ergebnis in absteigender Reihenfolge anzuzeigen.freq[3]++
- ersetzen Sie 3 durch die Spaltennummer.Hier geht:
quelle
Perl
Dieser Code berechnet das Vorkommen aller Spalten und druckt für jede Spalte einen sortierten Bericht:
Speichern Sie den Text als columnvalues.pl
Führen Sie ihn aus als:
perl columnvalues.pl files*
Erläuterung
In der while-Schleife der obersten Ebene:
* Schleife über jede Zeile der kombinierten Eingabedateien
* Teilen Sie die Zeile in das @ Fields-Array auf
* Inkrementieren Sie für jede Spalte die Ergebnis-Array-of-Hash-Datenstruktur
In der for-Schleife der obersten Ebene:
* Schleife über das Ergebnisarray
* Drucken der Spaltennummer
* Abrufen der in dieser Spalte verwendeten Werte
* Sortieren der Werte nach der Anzahl der Vorkommen
* Sekundäre Sortierung basierend auf dem Wert (z. B. b vs g vs m vs z)
* Durchlaufen Sie den Ergebnis-Hash anhand der sortierten Liste
* Drucken Sie den Wert und die Anzahl jedes Vorkommens aus
Ergebnisse basierend auf den von @Dennis bereitgestellten Beispiel-Eingabedateien
CSV-Eingabe
Wenn Ihre Eingabedateien .csv sind, wechseln Sie
/\s+/
zu/,/
Verschleierung
In einem hässlichen Wettbewerb ist Perl besonders gut ausgerüstet.
Dieser Einzeiler macht das Gleiche:
quelle
Rubin (1,9+)
quelle
each_with_object
unter anderem mit. Kurz gesagt, dies ist etwas grob geschrieben.