Contar valores distintos de um campo em um arquivo

17

Eu tenho um arquivo que contém cerca de um milhão de linhas. Nas linhas, tenho um campo chamado transactionid, que tem valores repetitivos. O que preciso fazer é contá-los de maneira distinta.

Não importa quantas vezes um valor seja repetido, ele deve ser contado apenas uma vez.

Olgun Kaya
fonte
seria mais fácil, se você pudesse apenas dar uma olhada no formato do arquivo ... não necessariamente nos dados.
Nikhil Mulley
btw, você deseja que o valor seja contado como 1, independentemente de quantas vezes ele exista, ou deseja a contagem do número de ocorrências / repetições? se você apenas deseja que seja contado uma vez, como os valores distintos são contados? Você pode verificar minha edição na sua pergunta e confirmar se estou certo em interpretar.
Nikhil Mulley
@Nikhil Isso fica claro na pergunta:... No matter of how many times a value is repeated, it should be counted as 1. ...
ok, então a resposta de @hesse faria sua necessidade.
Nikhil Mulley
desculpe pela latência. Eu estava sem conexão com a internet. separador é 2 | ' e campo é campo 28. Eu usei; cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l a cláusula if era para outra verificação de data como parece óbvio :)
Olgun Kaya

Respostas:

23

OK, supondo que seu arquivo seja um arquivo de texto, com os campos separados por separador de vírgula ','. Você também saberia qual campo 'transactionid'está em termos de sua posição. Supondo que seu 'transactionid'campo seja o 7º.

awk -F ',' '{print $7}' text_file | sort | uniq -c

Isso contaria as ocorrências distintas / únicas no 7º campo e imprimirá o resultado.

Nikhil Mulley
fonte
Por que sortantes do uniqcomando.
G10guang
@ g10guang Porque para uniqeliminar registros, eles precisam estar próximos um do outro.
dsz 13/01
3

Talvez não seja o método mais elegante, mas isso deve funcionar:

awk '{print $1}' your_file | sort | uniq | wc -l

onde $1é o número correspondente ao campo a ser analisado.


fonte
3

Não há necessidade de classificar o arquivo. ( uniqRequer que o arquivo seja classificado)
Este script do awk assume que o campo é o primeiro campo delimitado por espaço em branco.

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 
Peter.O
fonte
Para um arquivo grande (como chegar perto do tamanho da RAM), o awk consumirá muita memória. A maioria das sortimplementações é projetada para lidar bem com arquivos enormes.
Gilles 'SO- stop be evil'