Dateien nach Häufigkeit des Zeileninhalts sortieren - Duplikate drucken

1013
GeekyGeek

Stellen Sie sich vor, es gibt eine Datei -

a b b b b c c d d d 

Ich möchte, dass die Ausgabe nach Häufigkeit sortiert wird (ich möchte, dass die doppelten Zeilen ebenfalls gedruckt werden) als

b b b b d d d c c a 
-1

2 Antworten auf die Frage

3
Attie

Das Folgende wird tun, was Sie wollen ... obwohl es viele andere Möglichkeiten gibt, um dies zu erreichen ... zum Beispiel mit gawkder Antwort von Kamil.

  • Der erste sortordnet die Daten nach Zeilendaten an
  • uniq -c zählt die Anzahl der übereinstimmenden Vorkommen (sie müssen Nachbarn sein)
  • sort -nr sortiert nach Anzahl der Vorkommen in umgekehrter Reihenfolge
  • Die whileSchleife durchläuft jede Zeile
    • read n lnimmt die Zählung in nund die Zeilendaten in aufl
  • Die forSchleife wird nZeiten durchlaufen
  • echo "$" gibt die Zeilendaten aus
( sort \ | uniq -c \ | sort -nr \ | while read n l; do \ for i in $(seq $); do \ echo "$"; \ done; \ done ) <<"EOF" a b b b b c c d d d EOF 
3
Kamil Maciorowski

Mit GNU Awk:

gawk ' { arr[$0]++ } END { PROCINFO["sorted_in"] = "@val_num_desc" for (ln in arr) for (i = 1; i <= arr[ln]; i++) print ln } ' 

Der Trick ist die Verwendung eines Arrays und @val_num_desc. Jede angetroffene Zeile wird zu einem Index, der zugehörige Wert wird jedes Mal erhöht, wenn die Zeile angezeigt wird. Am Ende scannen wir das gesamte Array in einer bestimmten Reihenfolge:

"@val_num_desc"
[…] Die als Zahlen behandelten Elementwerte werden von hoch nach niedrig geordnet.

Quelle

Die äußere (erste) forist also dafür verantwortlich, Zeilen und deren Frequenzen in der gewünschten Reihenfolge abzurufen; Die innere (zweite) fordient nur zum Drucken der gerade ausgewählten Zeile mit der richtigen Anzahl von Malen.

Hinweis:

  • Jeder Charakter ist wichtig. Eine Zeile und dieselbe Zeile mit einem zusätzlichen Leerzeichen unterscheiden sich.
`PROCINFO [" sortiert_in "]` - super, genau das, wonach ich gesucht habe, um auch ein `awk`-Beispiel zu machen, danke! Attie vor 6 Jahren 0
@Attie Ich denke, es funktioniert möglicherweise nicht im einfachen "awk", es sei denn, Ihr "awk" ist "gawk" in Verkleidung. In meinem Debian war "awk" früher zu begrenzt, ich musste "gawk" installieren. Nun verstehen beide Befehle das, weil "awk" (nicht direkt) mit "gawk" verknüpft ist. Kamil Maciorowski vor 6 Jahren 3