Perl
Цей код обчислює входження всіх стовпців і друкує відсортований звіт для кожного з них:
# 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"
}
}
Збережіть текст як columnvalues.pl
Запустіть його як: perl columnvalues.pl files*
Пояснення
У верхньому рівні циклу while:
*
Переведіть петлю на кожен рядок комбінованих вхідних файлів * Розділіть рядок на масив @Fields
* Для кожного стовпця збільшуйте структуру даних масиву хешів результатів
У циклі верхнього рівня for:
* Проведіть цикл масиву результатів
* Виведіть номер стовпця
* Отримайте значення, що використовуються в цьому стовпці
* Відсортуйте значення за кількістю випадків
* Вторинне сортування на основі значення (наприклад, b проти g vs m проти z)
* Перебирайте хеш результату, використовуючи відсортований список
* Надрукуйте значення та кількість кожного входження
Результати засновані на зразкових вхідних файлах, наданих @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 введення
Якщо ваші вхідні файли .csv, змініть /\s+/
на/,/
Затуманення
У потворному змаганні Perl особливо добре обладнаний.
Цей однокласник робить те саме:
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*