Policz, ile razy każda linia pojawia się w pliku

23

Powiedz, że mam plik zawierający:

A
A
A
B
CC

Chcę mieć takie dane wyjściowe:

A 3
B 1
CC 1
Cheng
źródło

Odpowiedzi:

23

Rozgryzłem to; jedną z uniqopcji jest -c, dla „wierszy prefiksu według liczby wystąpień”:

$ uniq -c
Cheng
źródło
1
Zauważ, że liczby są na pierwszym miejscu. Jeśli byłeś wybredny co do zamówienia, możesz zrobić:uniq -c filename.txt | sed 's/[^0-9]*\\([0-9]\+\\) \\(.*\\)/\2 \1/'
frabjous
12
Zauważ też, że zlicza tylko sąsiednie powtarzające się linie. Powszechnym idiomem jestsort | uniq
Steven D.
4
uniq stawia również liczbę przed punktem odniesienia. Pierwotne pytanie wymagałoby czegoś takiego: sort nazwa pliku | uniq -c | awk '{print 2 $, 1 $}'
Bruce Ediger
Jeśli powyższe komentarze nie są jasne, musisz najpierw posortować dane, aby osiągnąć swój cel. Jeśli nie zostanie posortowane, będziesz mieć powtarzane wpisy. Na przykład, jeśli oryginalny plik byłby zamiast tego A \ A \ A \ B \ A \ CC, wynik po prostu uniq -cpokaże, A 3a później pokaże A 1. Sortowanie w pierwszej kolejności zagwarantuje, że wszystkie identyczne linie zostaną zgrupowane razem
drootang,
16

Właśnie przyszedłem tutaj z podobnym problemem. Z tego udało mi się zebrać nieco bardziej zaawansowane polecenie, które, mam nadzieję, będzie przydatne dla innych.

Jak powiedział Steven D w powyższych komentarzach, uniqliczy tylko sąsiednie powtarzające się linie, więc najpierw musisz posortować linie. Następnie znajdujemy unikalne linie, a następnie sortujemy ponownie, aby najczęściej występujące linie były na górze.

sort file.txt | uniq -c | sort -nr > output.txt

Dane wyjściowe są przekierowywane do pliku output.txt. Jeśli chcesz tylko wyświetlić wyniki w wierszu poleceń, usuń przekierowanie i zmień ostatnie polecenie na sort -ntak, aby najczęstsza linia znajdowała się na dole, tj. Zdecydowanie nadal na ekranie.

DisgruntledGoat
źródło
4
Możesz wymienić na cat file.txt | sortjust sort file.txt. :)
mattdm,
1
@mattdm: wadą tego sformułowania jest to, że nie można szybko zastąpić catczegoś bardziej interesującego. Ponieważ wiesz, nie ma cat.
SamB,
1
@SamB Następnie napisz jako < file.txt sort | uniq -c. Jest to łatwe do edycji i wciąż unika niepotrzebnych cat.
hvd