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 -n
si 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