ฉันต้องการโปรแกรมที่แสดงจำนวนอักขระที่แตกต่างกันในไฟล์ ตัวอย่าง:
> stats testfile
' ': 207
'e': 186
'n': 102
มีเครื่องมือใด ๆ อยู่หรือไม่?
ฉันต้องการโปรแกรมที่แสดงจำนวนอักขระที่แตกต่างกันในไฟล์ ตัวอย่าง:
> stats testfile
' ': 207
'e': 186
'n': 102
มีเครื่องมือใด ๆ อยู่หรือไม่?
คำตอบ:
ต่อไปนี้ควรทำงาน:
$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c
อันดับแรกเราแทรกบรรทัดใหม่หลังจากตัวละครทุกตัววางอักขระแต่ละตัวในบรรทัดของตัวเอง จากนั้นเราก็จัดเรียง จากนั้นเราใช้คำสั่ง uniq เพื่อลบรายการที่ซ้ำกันนำหน้าแต่ละบรรทัดด้วยจำนวนการเกิดขึ้นของอักขระนั้น
sort -nr
เพื่อจัดเรียงรายการตามความถี่และการท่อนี้ทั้งหมดลง
sed
เช่นนี้ แต่โซลูชัน Python ของ Jacob Vlijmทำงานได้ดีสำหรับฉัน
วิธีการแก้ปัญหาของ 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) }'
เวอร์ชันที่ช้า แต่ค่อนข้างเป็นมิตรกับหน่วยความจำโดยใช้ 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
sed 's/\(.\)/\1\'$'\n/g' text.txt