Vorkommen in der ersten Spalte einer Datei zählen


9

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?


3
Hallo Arashams! Ich habe gesehen, dass Sie kürzlich sehr ähnliche Fragen gestellt haben, die sich alle um dasselbe Thema drehen. Ich bin sicher, die Community würde Ihnen gerne helfen, aber vielleicht könnten Sie uns zeigen, was Sie bereits versucht haben und wo genau Sie stecken geblieben sind? Wir fordern die Leute auf, sich ein wenig Mühe zu geben, bevor sie ihre Fragen stellen - es ist kein Lernen erforderlich, wenn sie einfach andere bitten, Ihnen den Code für eine bestimmte Sache zu geben. Warum sagen Sie uns nicht, was genau der Hintergrund dafür ist? Vielleicht gibt es einen einfacheren Weg, um das zu erreichen, was Sie wollen, und wir müssen nicht auf Dummy-Beispiele mit einigen abstrakten Zahlen zurückgreifen?
Slhck

tnx für deine hilfe. Ich arbeite mit BGPDump-Daten und analysiere sie.
Arash

Antworten:


12

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

tnx .its funktioniert :)
Arash

Könntest du bitte den Code erklären? awk '{h [$ 1] ++} END {für (k in h) print k, h [k]}' | sort -n
Arash

3
@arashams: Der {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.
Thor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.