Zählen von Duplikaten in einer sortierten Sequenz mithilfe von Befehlszeilentools

Zählen von Duplikaten in einer sortierten Sequenz mithilfe von Befehlszeilentools

Ich habe einen Befehl (cmd1), der eine Protokolldatei durchsucht, um eine Reihe von Zahlen herauszufiltern. Die Zahlen sind in zufälliger Reihenfolge, daher verwende ich ihn, um sort -greine umgekehrt sortierte Liste von Zahlen zu erhalten. Diese sortierte Liste kann Duplikate enthalten. Ich muss die Anzahl für jede eindeutige Zahl in dieser Liste ermitteln.

Wenn die Ausgabe von cmd1 beispielsweise lautet:

100 100 100 99 99 26 25 24 24

Ich brauche einen anderen Befehl, an den ich die obige Ausgabe weiterleiten kann, sodass ich Folgendes erhalte:

100 3 99 2 26 1 25 1 24 2

Antwort1

Wenn Sie damit klarkommen, dass die Ausgabe ein leicht anderes Format hat, können Sie Folgendes tun:

cmd1 | tr " " "\n" | uniq -c

Sie erhalten Folgendes zurück:

  3 100
  2 99
  1 26
  1 25
  2 24

Antwort2

Fügen Sie außerdem den Schalter -u hinzu. Sie erhalten dann:

cmd1 | sort -gru

Aus der Manpage „Sort“:

-u, --unique
ohne -c, gibt nur den ersten Teil einer gleichen Folge aus

Antwort3

(Ich gehe davon aus, dass Ihre Eingabe eine Zahl pro Zeile ist, da dies die Ausgabe von sort wäre.)

Sie könnten es mit awk versuchen:

<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'

Dadurch erhalten Sie eine unsortierte Liste (die Reihenfolge, in der die Arrays in awk durchlaufen werden, ist meines Wissens nicht definiert), sodass Sie erneut nach Ihren Wünschen sortieren müssen.

Antwort4

$ echo '100 100 100 99 99 26 25 24 24' | perl -e 'while (<>) { chomp; my %nums; foreach (split(/ /)) { $nums{$_} += 1; }; foreach (sort {$b <=> $a} keys %nums) { print "$_ $nums{$_} " }; print "\n"; }'
100 3 99 2 26 1 25 1 24 2

verwandte Informationen