Perl
Ce code calcule les occurrences de toutes les colonnes et imprime un rapport trié pour chacune d'elles:
# columnvalues.pl
while (<>) {
@Fields = split /\s+/;
for $i ( 0 .. $#Fields ) {
$result[$i]{$Fields[$i]}++
};
}
for $j ( 0 .. $#result ) {
print "column $j:\n";
@values = keys %{$result[$j]};
@sorted = sort { $result[$j]{$b} <=> $result[$j]{$a} || $a cmp $b } @values;
for $k ( @sorted ) {
print " $k $result[$j]{$k}\n"
}
}
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
column 0:
a 3
z 3
t 1
v 1
w 1
column 1:
d 3
r 2
b 1
g 1
m 1
z 1
column 2:
c 4
a 3
e 2
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:
perl -lane 'for $i (0..$#F){$g[$i]{$F[$i]}++};END{for $j (0..$#g){print "$j:";for $k (sort{$g[$j]{$b}<=>$g[$j]{$a}||$a cmp $b} keys %{$g[$j]}){print " $k $g[$j]{$k}"}}}' files*