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.


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.


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.


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 

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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.