Suponha que eu tenha um arquivo semelhante ao seguinte:
123
123
234
234
123
345
Gostaria de descobrir quantas vezes '123' foi duplicado, quantas vezes '234' foi duplicado, etc. Então, idealmente, a saída seria como:
123 3
234 2
345 1
Suponha que eu tenha um arquivo semelhante ao seguinte:
123
123
234
234
123
345
Gostaria de descobrir quantas vezes '123' foi duplicado, quantas vezes '234' foi duplicado, etc. Então, idealmente, a saída seria como:
123 3
234 2
345 1
Respostas:
Supondo que haja um número por linha:
sort <file> | uniq -c
Você pode usar o --count
sinalizador mais detalhado também com a versão GNU, por exemplo, no Linux:
sort <file> | uniq --count
sort
novamente como:sort <file> | uniq -c | sort -n
Isso imprimirá apenas linhas duplicadas , com contagens:
sort FILE | uniq -cd
ou, com as opções longas do GNU (no Linux):
sort FILE | uniq --count --repeated
no BSD e OSX, você deve usar o grep para filtrar linhas exclusivas:
sort FILE | uniq -c | grep -v '^ *1 '
Para o exemplo dado, o resultado seria:
3 123
2 234
Se você deseja imprimir contagens para todas as linhas, incluindo aquelas que aparecem apenas uma vez:
sort FILE | uniq -c
ou, com as opções longas do GNU (no Linux):
sort FILE | uniq --count
Para a entrada fornecida, a saída é:
3 123
2 234
1 345
Para classificar a saída com as linhas mais frequentes no topo, você pode fazer o seguinte (para obter todos os resultados):
sort FILE | uniq -c | sort -nr
ou, para obter apenas linhas duplicadas, as mais frequentes primeiro:
sort FILE | uniq -cd | sort -nr
no OSX e no BSD, o final se torna:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
ou | sort -nr
ao pipe classificará a saída pela contagem de repetições (ascendente ou descendente, respectivamente). Não é isso que você está perguntando, mas achei que poderia ajudar.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Através da awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
No awk 'dups[$1]++'
comando, a variável $1
contém todo o conteúdo da coluna1 e colchetes são acesso à matriz. Portanto, para cada primeira coluna da linha no data
arquivo, o nó da matriz nomeada dups
é incrementado.
E, no final, estamos repetindo o dups
array com a num
variável e imprimimos os números salvos primeiro e depois o número de valores duplicados dups[num]
.
Observe que seu arquivo de entrada possui espaços no final de algumas linhas; se você os esclarecer, poderá usar $0
no lugar do $1
comando acima :)
uniq
?
sort | uniq
e a solução awk possui vantagens e desvantagens em termos de desempenho e recursos: se os arquivos são grandes e o número de linhas diferentes é pequeno, a solução awk é muito mais eficiente. É linear no número de linhas e o uso do espaço é linear no número de linhas diferentes. OTOH, a solução awk precisa manter todas as diferentes linhas na memória, enquanto a classificação (GNU) pode recorrer a arquivos temporários.
Nas janelas usando o "Windows PowerShell" , usei o comando mencionado abaixo para conseguir isso
Get-Content .\file.txt | Group-Object | Select Name, Count
Também podemos usar o Cmdlet where-object para filtrar o resultado
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Supondo que você tenha acesso a um ambiente padrão do shell Unix e / ou cygwin:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Basicamente: converta todos os caracteres de espaço em quebras de linha, classifique a saída traduzida e alimente-a para uniq e conte linhas duplicadas.