Conta valori distinti di un campo in un file


17

Ho un file che contiene circa un milione di righe. Nelle righe ho un campo chiamato transactionid, che ha valori ripetitivi. Quello che devo fare è contarli distintamente.

Indipendentemente da quante volte un valore viene ripetuto, dovrebbe essere conteggiato una sola volta.


sarebbe più facile, se solo potessi dare un'occhiata al formato del file ... non necessariamente i dati.
Nikhil Mulley,

tra l'altro, vuoi che il valore sia conteggiato come 1 indipendentemente da quante volte esiste o vuoi il conteggio del numero di occorrenze / ripetizioni? se vuoi che venga contato una volta, come vengono contati i valori distinti? Potete per favore controllare la mia modifica sulla vostra domanda e confermare se ho ragione nell'interpretazione.
Nikhil Mulley,

@Nikhil Questo è chiaro dalla domanda:... No matter of how many times a value is repeated, it should be counted as 1. ...

ok, allora la risposta di @hesse farebbe al caso tuo.
Nikhil Mulley,

scusa per la latenza. Ero fuori dalla connessione Internet. il separatore è 2 | ' e il campo è il campo 28. Ho usato; cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l la clausola if era per un altro controllo della data come sembra ovvio :)
Olgun Kaya

Risposte:


23

OK, supponendo che il tuo file sia un file di testo, con i campi separati dal separatore virgola ','. Sapresti anche quale campo 'transactionid'è in termini di posizione. Supponendo che il tuo 'transactionid'campo sia il 7 ° campo.

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

Ciò conterrebbe le occorrenze distinte / uniche nel settimo campo e stampa il risultato.


Perché sortprima del uniqcomando.
g10guang,

@ g10guang Perché per uniqeliminare i record devono essere uno accanto all'altro.
dsz

3

Forse non è il metodo più elegante, ma questo dovrebbe funzionare:

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

dove $1è il numero corrispondente al campo da analizzare.


3

Non è necessario ordinare il file .. ( uniqrichiede che il file sia ordinato)
Questo script awk presuppone che il campo sia il primo campo delimitato da spazi bianchi.

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 

Per un file di grandi dimensioni (come in, avvicinandosi alla dimensione della RAM), awk consumerà molta memoria. La maggior parte delle sortimplementazioni sono progettate per gestire bene file di grandi dimensioni.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.