Perl
รหัสนี้คำนวณการเกิดขึ้นของคอลัมน์ทั้งหมดและพิมพ์รายงานที่เรียงลำดับสำหรับแต่ละคอลัมน์:
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*
คำอธิบาย
ในระดับบนสุดในขณะที่วนซ้ำ:
* วนซ้ำแต่ละบรรทัดของไฟล์อินพุตที่รวมกัน
* แยกบรรทัดลงในอาร์เรย์ @Fields
* สำหรับทุกคอลัมน์ให้เพิ่มโครงสร้างข้อมูลอาร์เรย์ของแฮชผลลัพธ์
ในระดับบนสุดสำหรับลูป:
* วนซ้ำเหนืออาร์เรย์ผลลัพธ์
* พิมพ์หมายเลขคอลัมน์
* รับค่าที่ใช้ในคอลัมน์นั้น
* เรียงลำดับค่าตามจำนวนครั้งที่เกิดขึ้น
* การเรียงลำดับรองตามค่า (ตัวอย่างเช่น b vs g vs m vs 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*