Compter les occurrences dans la première colonne d'un fichier

9

Nous avons ce fichier:

1 2 
1 3
1 2
3 3
52 1
52 300

et 1000 de plus.

Je veux compter le nombre de fois que chaque valeur se produit dans la première colonne.

1  3 
3  1
52 2

Cela signifie que nous avons vu 1trois fois.

Comment puis-je faire cela, en Perl, AWK ou Bash?

Arash
la source
3
Salut arashams! Je vous ai vu récemment posé des questions très similaires qui tournent toutes autour du même sujet. Je suis sûr que la communauté aimerait vous aider, mais peut-être pourriez-vous nous montrer ce que vous avez déjà essayé et où exactement vous êtes coincé? Nous demandons aux gens de faire un petit effort avant de poser leurs questions - il n'y a pas d'apprentissage à faire en demandant simplement aux autres de vous donner le code d'une chose spécifique. Pourquoi ne pas nous dire quel est exactement le contexte de cela? Peut-être existe-t-il un moyen plus facile d'accomplir ce que vous voulez, et nous n'avons pas besoin de recourir à des exemples factices avec des nombres abstraits?
slhck
tnx pour votre aide. je travaille avec des données bgpdump et les analyse.
Arash

Réponses:

12

Si l'entrée est triée, vous pouvez utiliser uniq:

<infile cut -d' ' -f1 | uniq -c

Sinon, triez-le d'abord:

<infile cut -d' ' -f1 | sort -n | uniq -c

Production:

  3 1                                      
  1 3
  2 52

La sortie est échangée par rapport à vos besoins, vous pouvez l'utiliser awk '{ print $2, $1 }'pour changer cela.

1 3 
3 1
52 2

Il y a aussi l'idiome awk, qui ne nécessite pas d'entrée triée:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

Production:

1 3
52 2
3 1

Comme la sortie ici provient d'un hachage, elle ne sera pas commandée, passez à sort -nsi cela est nécessaire:

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

Si vous utilisez GNU awk, vous pouvez effectuer le tri depuis awk:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

Dans les deux derniers cas, la sortie est:

1 3
3 1
52 2
Thor
la source
tnx .its a fonctionné :)
Arash
pourriez-vous plz expliquer le code ??? awk '{h [$ 1] ++} END {for (k in h) print k, h [k]}' | sort -n
Arash
3
@arashams: le {h[$1]++}bloc est évalué pour chaque ligne. hest un hachage et $1est la première colonne et utilisée comme clé dans h. Donc, cela correspond à la fréquence à laquelle les uniques $1sont vus. Le ENDbloc est exécuté à la fin de la saisie et imprime les clés et les décomptes. sort -ntrie la sortie numériquement.
Thor