Perl
Mã này tính toán các lần xuất hiện của tất cả các cột và in một báo cáo được sắp xếp cho từng cột trong số chúng:
# 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"
}
}
Lưu văn bản dưới dạng giá trị column.pl
Chạy nó dưới dạng: perl columnvalues.pl files*
Giải trình
Trong vòng lặp while cấp cao nhất:
* Lặp lại từng dòng của tệp đầu vào được kết hợp
* Tách dòng thành mảng @Fields
* Đối với mỗi cột, hãy tăng cấu trúc dữ liệu mảng-của-băm kết quả
Trong vòng lặp for cấp cao nhất:
* Lặp lại mảng kết quả
* In số cột
* Lấy các giá trị được sử dụng trong cột đó
* Sắp xếp các giá trị theo số lần xuất hiện
* Sắp xếp thứ cấp dựa trên giá trị (ví dụ: b vs g vs m vs z)
* Lặp lại thông qua băm kết quả, sử dụng danh sách đã sắp xếp
* In giá trị và số của mỗi lần xuất hiện
Kết quả dựa trên các tệp đầu vào mẫu do @Dennis cung cấp
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
đầu vào .csv
Nếu tệp đầu vào của bạn là .csv, hãy thay đổi /\s+/
thành/,/
Sự xáo trộn
Trong một cuộc thi xấu xí, Perl đặc biệt được trang bị tốt.
Một lớp lót này thực hiện tương tự:
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*