Zliczanie wystąpień w pierwszej kolumnie pliku

8

Mamy ten plik:

1 2 
1 3
1 2
3 3
52 1
52 300

i jeszcze 1000.

Chcę policzyć, ile razy każda wartość występuje w pierwszej kolumnie.

1  3 
3  1
52 2

To znaczy, że widzieliśmy 1 trzy razy.

Jak mogę to zrobić w Perlu, AWK lub Bash?

Arash
źródło
3
Cześć arashams! Widziałem, jak ostatnio zadałeś bardzo podobne pytania, które dotyczą tego samego tematu. Jestem pewien, że społeczność chciałaby ci pomóc, ale może mógłbyś pokazać nam, co już próbowałeś i gdzie dokładnie utknąłeś? Wymagamy od ludzi, aby przed zadawaniem pytań wykazali się niewielkim wysiłkiem - nie trzeba się uczyć od zwykłego proszenia innych o podanie kodu dla konkretnej rzeczy. Dlaczego nie powiesz nam, na czym dokładnie polega to tło? Może jest łatwiejszy sposób na osiągnięcie tego, czego chcesz, i nie musimy uciekać się do fałszywych przykładów z abstrakcyjnymi liczbami?
slhck
tnx za pomoc. Pracuję z danymi bgpdump i analizuję je.
Arash
@slhck Komentujesz zasługuje na DUŻO więcej niż mój upvote i jeden inny!
pnuts

Odpowiedzi:

12

Jeśli dane wejściowe są posortowane, możesz użyć uniq:

<infile cut -d' ' -f1 | uniq -c

Jeśli nie, posortuj najpierw:

<infile cut -d' ' -f1 | sort -n | uniq -c

Wydajność:

  3 1                                      
  1 3
  2 52

Dane wyjściowe są zamieniane w porównaniu z wymaganiami, można użyć awk '{ print $2, $1 }' zmienić to.

1 3 
3 1
52 2

Jest też idiom awk, który nie wymaga posortowanego wejścia:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

Wydajność:

1 3
52 2
3 1

Ponieważ wyjście pochodzi z skrótu, nie zostanie zamówione, przejdź do sort -n jeśli to konieczne:

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

Jeśli używasz GNU awk, możesz wykonać sortowanie z poziomu awk:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

W dwóch ostatnich przypadkach dane wyjściowe to:

1 3
3 1
52 2
Thor
źródło
tnx .its pracował :)
Arash
czy mógłbyś wyjaśnić kod? awk '{h [$ 1] ++} END {dla (k in h) print k, h [k]}' | sort -n
Arash
3
@arashams: The {h[$1]++} blok jest oceniany dla każdej linii. h jest hashem i $1 jest pierwszą kolumną i służy jako klucz do h. Więc to pokazuje, jak często unikalne $1 są widoczne. The END blok jest wykonywany na końcu wejścia i drukuje klucze i wartości. sort -n sortuje wyjście numerycznie.
Thor