Perl
Este código calcula las ocurrencias de todas las columnas e imprime un informe ordenado para cada una de ellas:
# 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"
}
}
Guarde el texto como columnvalues.pl
Ejecútelo como: perl columnvalues.pl files*
Explicación
En el bucle while de nivel superior:
* Recorre cada línea de los archivos de entrada combinados
* Divide la línea en la matriz @Fields
* Para cada columna, incrementa la estructura de datos de matriz de hashes de resultado
En el bucle for de nivel superior:
* Recorrer la matriz de resultados
* Imprimir el número de columna
* Obtener los valores utilizados en esa columna
* Ordenar los valores por el número de ocurrencias
* Orden secundario basado en el valor (por ejemplo, b vs g vs m vs z)
* Itere a través del hash del resultado, usando la lista ordenada
* Imprima el valor y el número de cada ocurrencia
Resultados basados en los archivos de entrada de muestra proporcionados 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
.csv entrada
Si sus archivos de entrada son .csv, cambie /\s+/
a/,/
Ofuscación
En un feo concurso, Perl está particularmente bien equipado.
Este one-liner hace lo mismo:
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*