ฉันจะนับจำนวนตัวอักษรต่าง ๆ ในไฟล์ได้อย่างไร?


19

ฉันต้องการโปรแกรมที่แสดงจำนวนอักขระที่แตกต่างกันในไฟล์ ตัวอย่าง:

> stats testfile
' ': 207
'e': 186
'n': 102

มีเครื่องมือใด ๆ อยู่หรือไม่?

คำตอบ:


21

ต่อไปนี้ควรทำงาน:

$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c

อันดับแรกเราแทรกบรรทัดใหม่หลังจากตัวละครทุกตัววางอักขระแต่ละตัวในบรรทัดของตัวเอง จากนั้นเราก็จัดเรียง จากนั้นเราใช้คำสั่ง uniq เพื่อลบรายการที่ซ้ำกันนำหน้าแต่ละบรรทัดด้วยจำนวนการเกิดขึ้นของอักขระนั้น

sort -nrเพื่อจัดเรียงรายการตามความถี่และการท่อนี้ทั้งหมดลง


4
สำหรับ sed สำหรับ Mac OS X มันsed 's/\(.\)/\1\'$'\n/g' text.txt
mb21

ดีมาก แต่น่าเสียดายที่มันทำงานไม่ถูกต้องหากข้อความมีอักขระ Unicode (utf8) อาจมีวิธีในการทำsedเช่นนี้ แต่โซลูชัน Python ของ Jacob Vlijmทำงานได้ดีสำหรับฉัน
bitinerant

14

วิธีการแก้ปัญหาของ Steven นั้นดีและเรียบง่าย มันไม่ค่อยมีประสิทธิภาพสำหรับไฟล์ที่มีขนาดใหญ่มาก (ไฟล์ที่ไม่พอดีกับ RAM ของคุณประมาณครึ่งหนึ่ง) เนื่องจากขั้นตอนการเรียงลำดับ นี่คือรุ่น awk นอกจากนี้ยังเป็นเล็ก ๆ น้อย ๆ ที่มีความซับซ้อนมากขึ้นเพราะมันพยายามที่จะทำสิ่งที่ถูกต้องสำหรับตัวอักษรพิเศษไม่กี่ (บรรทัดใหม่', \, :)

awk '
  {for (i=1; i<=length; i++) ++c[substr($0,i,1)]; ++c[RS]}
  function chr (x) {return x=="\n" ? "\\n" : x==":" ? "\\072" :
                           x=="\\" || x=="'\''" ? "\\" x : x}
  END {for (x in c) printf "'\''%s'\'': %d\n", chr(x), c[x]}
' | sort -t : -k 2 -r | sed 's/\\072/:/'

นี่คือทางออกของ Perl บนหลักการเดียวกัน Perl มีข้อดีของความสามารถในการเรียงลำดับภายใน นอกจากนี้สิ่งนี้จะไม่นับการขึ้นบรรทัดใหม่อย่างถูกต้องหากไฟล์ไม่ได้ลงท้ายด้วยอักขระขึ้นบรรทัดใหม่

perl -ne '
  ++$c{$_} foreach split //;
  END { printf "'\''%s'\'': %d\n", /[\\'\'']/ ? "\\$_" : /./ ? $_ : "\\n", $c{$_}
        foreach (sort {$c{$b} <=> $c{$a}} keys %c) }'

1
+1 สำหรับการไม่จัดเรียงที่น่ากลัว
Sparr

1

เวอร์ชันที่ช้า แต่ค่อนข้างเป็นมิตรกับหน่วยความจำโดยใช้ ruby ประมาณ RAM หนึ่งโหล MB โดยไม่คำนึงถึงขนาดอินพุต

# count.rb
ARGF.
  each_char.
  each_with_object({}) {|e,a| a[e] ||= 0; a[e] += 1}.
  each {|i| puts i.join("\t")}

ruby count.rb < input.txt
t       20721
d       20628
S       20844
k       20930
h       20783
... etc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.