Contar quantas vezes cada linha aparece em um arquivo

23

Digamos que eu tenha um arquivo que contenha:

A
A
A
B
CC

Eu quero ter a saída como esta:

A 3
B 1
CC 1
Cheng
fonte

Respostas:

23

Eu descobri; uma das uniqopções é -c"para linhas de prefixo pelo número de ocorrências":

$ uniq -c
Cheng
fonte
1
Observe que coloca os números em primeiro lugar. Se você fosse muito exigente com o pedido, poderia:uniq -c filename.txt | sed 's/[^0-9]*\\([0-9]\+\\) \\(.*\\)/\2 \1/'
frabjous
12
Observe também que conta apenas as linhas de repetição adjacentes. Um idioma comum ésort | uniq
Steven D
4
O uniq também coloca a contagem na frente do dado. A pergunta original realmente precisaria de algo assim: classificar nome do arquivo | uniq -c | awk '{print $ 2, $ 1}'
Bruce Ediger
Caso não esteja claro nos comentários acima, você deve garantir que os dados sejam classificados primeiro para atingir sua meta. Se não estiver classificado, você terá entradas repetidas. Por exemplo, se o seu arquivo original estivesse em vez disso A \ A \ A \ B \ A \ CC, a saída de just uniq -cseria mostrada A 3e mais tarde mostrada A 1. Classificando primeiro, irá garantir todas as linhas idênticas são agrupados
drootang
16

Eu só vim aqui com um problema semelhante. A partir disso, consegui montar um comando um pouco mais avançado, que espero que seja útil para outros.

Como Steven D disse nos comentários acima, uniqconta apenas as linhas de repetição adjacentes, então você precisa classificar as linhas primeiro. Depois disso, encontramos as linhas exclusivas e, em seguida, classificamos novamente, para que as linhas mais ocorrentes estejam no topo.

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

A saída é redirecionada para o arquivo output.txt. Se você quiser apenas exibir os resultados na linha de comando, remova o redirecionamento e altere o último comando para sort -nque a linha mais comum fique na parte inferior, ou seja, definitivamente ainda esteja na tela.

DisgruntledGoat
fonte
4
Você pode substituir cat file.txt | sortcom apenas sort file.txt. :)
mattdm
1
@mattdm: o lado negativo dessa formulação é que você não pode substituir rapidamente o catitem por algo mais interessante. Desde que, você sabe, não há cat.
SamB 18/11
1
@ SamB Então escreva como < file.txt sort | uniq -c. Isso é fácil de editar e ainda evita o desnecessário cat.
hvd 12/05