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

Respostas:


23

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

$ uniq -c

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.