Wir haben diese Datei:
1 2
1 3
1 2
3 3
52 1
52 300
und 1000 mehr.
Ich möchte zählen, wie oft jeder Wert in der ersten Spalte vorkommt.
1 3
3 1
52 2
Das heißt, wir haben 1dreimal gesehen.
Wie kann ich das in Perl, AWK oder Bash machen?
Wir haben diese Datei:
1 2
1 3
1 2
3 3
52 1
52 300
und 1000 mehr.
Ich möchte zählen, wie oft jeder Wert in der ersten Spalte vorkommt.
1 3
3 1
52 2
Das heißt, wir haben 1dreimal gesehen.
Wie kann ich das in Perl, AWK oder Bash machen?
Antworten:
Wenn die Eingabe sortiert ist, können Sie uniq verwenden:
<infile cut -d' ' -f1 | uniq -c
Wenn nicht, sortieren Sie es zuerst:
<infile cut -d' ' -f1 | sort -n | uniq -c
Ausgabe:
3 1
1 3
2 52
Die Ausgabe wird im Vergleich zu Ihrer Anforderung ausgetauscht. Sie können dies awk '{ print $2, $1 }'ändern.
1 3
3 1
52 2
Es gibt auch die awk-Sprache, für die keine sortierte Eingabe erforderlich ist:
awk '{h[$1]++}; END { for(k in h) print k, h[k] }'
Ausgabe:
1 3
52 2
3 1
Da die Ausgabe hier von einem Hash stammt, wird sie nicht bestellt. Übergeben Sie sie an, sort -nwenn dies erforderlich ist:
awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n
Wenn Sie GNU awk verwenden, können Sie die Sortierung innerhalb von awk durchführen:
awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'
In den letzten beiden Fällen lautet die Ausgabe:
1 3
3 1
52 2
{h[$1]++}Block wird für jede Zeile ausgewertet. hist ein Hash und $1ist die erste Spalte und wird als Schlüssel für verwendet h. Das zeigt also, wie oft Unikate $1gesehen werden. Der ENDBlock wird am Ende der Eingabe ausgeführt und druckt die Schlüssel und Zahlen. sort -nsortiert die Ausgabe numerisch.