Cuente valores distintos de un campo en un archivo

17

Tengo un archivo que contiene alrededor de millones de líneas. En las líneas tengo un campo llamado transactionid, que tiene valores repetitivos. Lo que necesito hacer es contarlos claramente.

No importa cuántas veces se repita un valor, debe contarse solo una vez.

Olgun Kaya
fuente
sería más fácil si pudieras echar un vistazo al formato del archivo ... no necesariamente los datos.
Nikhil Mulley
por cierto, ¿desea que el valor se cuente como 1 independientemente de cuántas veces exista, o desea el recuento del número de ocurrencias / repeticiones? si solo desea que se cuente una vez, ¿cómo se cuentan los valores distintos? ¿Puede verificar mi edición en su pregunta y confirmar si estoy en lo cierto al interpretar?
Nikhil Mulley
@Nikhil Esto queda claro a partir de la pregunta:... No matter of how many times a value is repeated, it should be counted as 1. ...
ok, entonces la respuesta de @hesse haría tu necesidad.
Nikhil Mulley
Perdón por la latencia. Estaba sin conexión a internet. separador es 2 | y el campo es el campo 28. Yo solía; cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l la cláusula if era para otra verificación de fecha, ya que parece obvio :)
Olgun Kaya

Respuestas:

23

OK, suponiendo que su archivo es un archivo de texto, que tiene los campos separados por un separador de coma ','. También sabría qué campo 'transactionid'está en términos de su posición. Suponiendo que su 'transactionid'campo es el séptimo campo.

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

Esto contaría las ocurrencias distintas / únicas en el séptimo campo e imprime el resultado.

Nikhil Mulley
fuente
¿Por qué sortantes del uniqcomando?
g10guang
@ g10guang Becasue para uniqeliminar los registros que necesitan estar uno al lado del otro.
dsz
3

Quizás no sea el método más elegante, pero esto debería funcionar:

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

donde $1es el número correspondiente al campo a analizar.


fuente
3

No es necesario ordenar el archivo ... ( uniqrequiere que el archivo esté ordenado)
Este script awk asume que el campo es el primer campo delimitado por espacios en blanco.

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 
Peter.O
fuente
Para un archivo enorme (como, acercarse al tamaño de la RAM), awk consumirá mucha memoria. La mayoría de las sortimplementaciones están diseñadas para hacer frente a grandes archivos.
Gilles 'SO- deja de ser malvado'