J'ai des fichiers délimités par des tabulations avec plusieurs colonnes. Je veux compter la fréquence d'apparition des différentes valeurs dans une colonne pour tous les fichiers d'un dossier et les trier par ordre décroissant de comptage (le plus grand nombre en premier). Comment puis-je accomplir cela dans un environnement de ligne de commande Linux?
Il peut utiliser n'importe quel langage de ligne de commande courant comme awk, perl, python, etc.
bash
command-line
frequency
sfacteur
la source
la source
-d,
pour délimiter les champs par une virgule ou tout autre délimiteur).cut -f 1 -d ' '
. Merci beaucoup. :)Le site GNU suggère ce joli script awk, qui imprime à la fois les mots et leur fréquence.
Changements possibles:
sort -nr
(et inverserword
etfreq[word]
) pour voir le résultat dans l'ordre décroissant.freq[3]++
- remplacer 3 par le numéro de colonne.Voici:
la source
Perl
Ce code calcule les occurrences de toutes les colonnes et imprime un rapport trié pour chacune d'elles:
Enregistrez le texte sous columnvalues.pl
Exécutez-le comme:
perl columnvalues.pl files*
Explication
Dans la boucle while de niveau supérieur:
* Boucle sur chaque ligne des fichiers d'entrée combinés
* Fractionne la ligne dans le tableau @Fields
* Pour chaque colonne, incrémente la structure de données résultat du tableau de hachages
Dans la boucle for de niveau supérieur:
* Boucle sur le tableau de résultats
* Imprimer le numéro de colonne
* Obtenir les valeurs utilisées dans cette colonne
* Trier les valeurs par le nombre d'occurrences
* Tri secondaire basé sur la valeur (par exemple b vs g vs m vs z)
* Itérer à travers le hachage du résultat, en utilisant la liste triée
* Imprimer la valeur et le numéro de chaque occurrence
Résultats basés sur les exemples de fichiers d'entrée fournis par @Dennis
entrée .csv
Si vos fichiers d'entrée sont .csv, passez
/\s+/
à/,/
Obfuscation
Dans un concours moche, Perl est particulièrement bien équipé.
Ce one-liner fait la même chose:
la source
Rubis (1.9+)
la source
each_with_object
, entre autres. En bref, c'est un peu grossièrement écrit.