Perl
Este código calcula as ocorrências de todas as colunas e imprime um relatório classificado para cada uma delas:
# 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"
}
}
Salve o texto como columnvalues.pl
Execute-o como: perl columnvalues.pl files*
Explicação
No loop while de nível superior:
* Loop sobre cada linha dos arquivos de entrada combinados
* Divida a linha na matriz @Fields
* Para cada coluna, incremente a estrutura de dados da matriz de hashes do resultado
No nível superior do loop:
* Loop sobre a matriz de resultados
* Imprime o número da coluna
* Obtenha os valores usados nessa coluna
* Classifique os valores pelo número de ocorrências
* Classificação secundária com base no valor (por exemplo b vs g vs m vs z)
* Iterar através do hash de resultado, usando a lista classificada
* Imprimir o valor e o número de cada ocorrência
Resultados baseados nos arquivos de entrada de amostra fornecidos por @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
entrada .csv
Se seus arquivos de entrada forem .csv, mude /\s+/
para/,/
Ofuscação
Em uma competição feia, o Perl é particularmente bem equipado.
Este one-liner faz o mesmo:
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*