Compter les valeurs distinctes d'un champ dans un fichier

17

J'ai un fichier contenant environ un million de lignes. Dans les lignes, j'ai un champ appelé transactionid, qui a des valeurs répétitives. Ce que je dois faire, c'est les compter distinctement.

Peu importe combien de fois une valeur est répétée, elle ne doit être comptée qu'une seule fois.

Olgun Kaya
la source
ce serait plus facile, si vous pouviez juste donner un aperçu du format du fichier ... pas nécessairement les données.
Nikhil Mulley
btw, voulez-vous que la valeur soit comptée comme 1 quel que soit le nombre de fois où elle existe, ou voulez-vous le nombre d'occurrences / répétitions? si vous voulez juste qu'il soit compté une fois, alors comment les valeurs distinctes sont-elles comptées? Pouvez-vous s'il vous plaît vérifier mon montage sur votre question et confirmer si j'ai raison d'interpréter.
Nikhil Mulley
@Nikhil Cela ressort clairement de la question:... No matter of how many times a value is repeated, it should be counted as 1. ...
ok, alors la réponse de @hesse ferait votre besoin.
Nikhil Mulley
désolé pour la latence. J'étais hors connexion Internet. seperator est 2 | ' et le champ est le champ 28. J'ai utilisé; cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l la clause if était pour une autre vérification de la date car cela semble évident :)
Olgun Kaya

Réponses:

23

OK, en supposant que votre fichier est un fichier texte, les champs étant séparés par une virgule ','. Vous sauriez également quel champ 'transactionid'est en termes de sa position. En supposant que votre 'transactionid'champ est le 7ème champ.

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

Cela compterait les occurrences distinctes / uniques dans le 7ème champ et imprime le résultat.

Nikhil Mulley
la source
Pourquoi sortavant la uniqcommande.
g10guang
@ g10guang Parce que uniqpour éliminer les enregistrements, ils doivent être côte à côte.
dsz
3

Ce n'est peut-être pas la méthode la plus élégante, mais cela devrait fonctionner:

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

$1est le numéro correspondant au champ à analyser.


la source
3

Il n'est pas nécessaire de trier le fichier .. ( uniqnécessite que le fichier soit trié)
Ce script awk suppose que le champ est le premier champ délimité par les espaces.

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 
Peter.O
la source
Pour un fichier énorme (comme dans, se rapprochant de la taille de la RAM), awk consommera beaucoup de mémoire. La plupart des sortimplémentations sont conçues pour bien gérer les fichiers volumineux.
Gilles 'SO- arrête d'être méchant'