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?
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?
Odpowiedzi:
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
{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.