génération de tableau de fréquences à partir d'un fichier
Donné un fichier d'entrée contenant qu'un seul numéro par ligne, comment pourrais-je obtenir un décompte du nombre de fois qu'un élément est survenu dans ce dossier?
cat input.txt
1
2
1
3
1
0
de sortie désirée (=>[1,3,1,1]):
cat output.txt
0 1
1 3
2 1
3 1
Ce serait formidable, si la solution pourrait également être étendu pour les nombres flottants.
- Ce type de sortie est simple et utile, mais ce n'est pas un histogramme. Voir, par exemple, quarknet.fnal.gov/toolkits/ati/histograms.html
- Je suis d'accord vous ne demandez pas pour un histogramme. Qui peut toutefois également être accomplie avec
bash
, qui est ce que je suis venu chercher. Voir cette question et ses réponses: unix.stackexchange.com/questions/177777/...
Vous devez vous connecter pour publier un commentaire.
Vous voulez dire que vous voulez un décompte du nombre de fois qu'un élément apparaît dans le fichier d'entrée? Tout d'abord trier (à l'aide de
-n
si l'entrée est toujours des nombres, comme dans votre exemple) puis de compter les résultats uniques.uniq
de commande. Je l'ai changé pourcat input.txt | sort -n | uniq -c | awk '{print $2 " " $1}'
, maintenant, je suis à l'obtention du résultat souhaité.<
opérateur de fichiers d'entrée dans les programmes et même des choses comme la boucle de constructions. Pour l'humour de la valeur, voir l'inutile l'utilisation de cat prixUne autre option:
awk-based
solution. De ce que j'ai compris, dans la première partie de stocker leshistogram
dans len
de la matrice de prise en compte des éléments dans la colonne$1
. LeEND
partie signifie qu'il va être faitafter
l'histogramme est construit, non? Il n'est pas nécessaire d'initialiser la variablei
pour les boucles dansawk
? Ensuite, lesort -n
va être appliquée uniquement dans la première colonne de la sortie:i, n[i]
, droit? j'.e pas surn[i]
? En outre, cette solution ne fonctionne que pourinteger
numéros (en raison de l'indexation de la table)?awk
solution a l'avantage de ne pas nécessitersort
! Pour rentrer dans l'ordre de sortie, il suffit de garder la trace des valeurs max et min vu et itérer sur leur situation, de vérifier si chacun est dans le tableau. (Cela ne fonctionne que pour les entiers, cependant, et pas avec des chars.)$1
, le premier mot, à$0
, l'ensemble de la ligne:awk '{n[$0]++} END {for (i in n) print i,n[i]}'
vous permet de trouver facilement et de compter en double les lignes en entrée. Génial.awk
de commande. En conséquence, la boucle for n'a rien fait, et l'action d'impression utilisé la dernière valeur dei
seulement.Au moins une partie de ce qui peut être fait avec
Mais l'ordre
number count
est inversé. Cela permettra de résoudre ce problème.sort test.dat | uniq -c | awk '{print $2"\t"$1}'
En plus des autres réponses, vous pouvez utiliser awk pour faire un simple graphique. (Mais, encore une fois, ce n'est pas un histogramme.)
À l'aide de
maphimbu
de la Debian stda package:De sortie:
maphimbu
travaille également avec virgule flottante:De sortie:
Une boucle sur chaque ligne avec
-n
Chaque
$_
nombre d'incréments de hachage%h
Une fois le
END
deinput.txt
a été atteint,sort {$a <=> $b}
le hachage numériquementImprimer le nombre
$n
et la fréquence$h{$n}
Même code qui fonctionne sur virgule flottante:
float.txt
de sortie:
sort keys %h
utilise un tri lexicographique; il n'a pas trier numériquement.