web-dev-qa-db-fra.com

génération d'une table de fréquences à partir d'un fichier

Étant donné un fichier d'entrée contenant un seul numéro par ligne, comment puis-je obtenir le nombre de fois qu'un élément s'est produit dans ce fichier?

cat input.txt
1
2
1
3
1
0

sortie souhaitée (=> [1,3,1,1]):

cat output.txt
0 1
1 3
2 1
3 1

Ce serait formidable si la solution pouvait également être étendue aux nombres flottants.

41
Javier

Une autre option:

awk '{n[$1]++} END {for (i in n) print i,n[i]}' input.txt | sort -n > output.txt
10
glenn jackman

Utilisation de maphimbu depuis le paquet Debian stda :

# use 'jot' to generate 100 random numbers between 1 and 5
# and 'maphimbu' to print sorted "histogram":
jot -r 100 1 5 | maphimbu -s 1

Production:

             1                20
             2                21
             3                20
             4                21
             5                18

maphimbu fonctionne également avec virgule flottante:

jot -r 100.0 10 15 | numprocess /%10/ | maphimbu -s 1

Production:

             1                21
           1.1                17
           1.2                14
           1.3                18
           1.4                11
           1.5                19
1
agc

Au moins une partie de cela peut être fait avec

sort output.txt | uniq -c

Mais l'ordre number count est inversé. Cela résoudra ce problème.

sort test.dat | uniq -c | awk '{print $2, $1}'
1
pavium

En plus des autres réponses, vous pouvez tilisez awk pour faire un graphique simple . (Mais, encore une fois, ce n'est pas un histogramme.)

Perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$n\t$h{$n}"}}' input.txt

Faites une boucle sur chaque ligne avec -n
Chaque $_ nombre incréments hachage %h
Une fois le END de input.txt a été atteint,
sort {$a <=> $b} le hachage numériquement
Imprimez le numéro $n et la fréquence $h{$n}

Code similaire qui fonctionne sur virgule flottante:

Perl -lne '$h{int($_)}++; END{for $n (sort {$a <=> $b} keys %h) {print "$n\t$h{$n}"}}' float.txt

float.txt

1.732
2.236
1.442
3.162
1.260
0.707

production:

0       1
1       3
2       1
3       1
0
Chris Koknat