
Seit jeher ... | sort | uniq -c | sort -nr
gruppiere und zähle ich Eingabezeilen, um zu ermitteln, wie viele Zeilen jeder Art in der Eingabe vorhanden sind.
Gibt es einen besseren Weg? Habe ich mir gerade eine schlechte Angewohnheit zugelegt? Gibt es einen besseren Weg mit Standard-Unix-Tools, die auf Ubuntu Linux 18.04+ installiert werden (oder Dinge, die weiter apt-get
weg sind?)
Antwort1
Ich denke, Sie haben hier den standardmäßigen, offensichtlichen *nix-Weg gewählt. Es ist ein vollkommen guter und vernünftiger Ansatz:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
2 cc
2 aa
1 dd
1 bb
Natürlich könnte man stattdessen auch ein kleines Skript verwenden und so nur einen Befehl benutzen, zum Beispiel mit gawk
:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' |
gawk '
BEGIN{ PROCINFO["sorted_in"] = "@val_num_desc" }
{ count[$0]++ }
END{ for(line in count){ print count[line],line}}'
2 cc
2 aa
1 dd
1 bb
Oder Perl:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' |
perl -lne '$k{$_}++ }{ for $i (sort { $k{$b} <=> $k{$a} } keys %k ){print "$k{$i} $i"}'
2 aa
2 cc
1 bb
1 dd
Aber das ist nur eine Neuerfindung des Rades. Außerdem müssen beide Skripte alle Eingaben erneut in den Speicher laden, was bei großen Datenmengen ein Problem sein kann. Bleiben Sie also einfach bei dem, was Sie tun. Es ist eine gute Lösung, wahrscheinlich die effizienteste, die es gibt.