นับจำนวนครั้งที่เกิดขึ้นของถ่านในไฟล์ข้อความธรรมดา


132

มีวิธีใดบ้างใน linux / terminal ในการนับจำนวนครั้งที่ char f เกิดขึ้นในไฟล์ข้อความธรรมดา


9
ในทางเทคนิคอาจถือได้ว่าเป็น sh / bash / etc คำถามการเขียนโปรแกรมดังนั้นฉันคิดว่ามันมีความถูกต้องในที่ใดที่หนึ่ง
Rob Hruska

@ Rob Hruska: ใช่ฉันยังคิดว่าเป็นการเขียนโปรแกรม bash ... @abrashka: คำตอบสำหรับคำถามแรกและคำถามที่สองของคุณคือ "ไม่"!
cupakob

คำตอบ:


178

แล้วสิ่งนี้ล่ะ:

fgrep -o f <file> | wc -l

หมายเหตุ: นอกจากจะจำ / ทำซ้ำและปรับแต่งได้ง่ายกว่ามากแล้วนี่ยังเร็วกว่าคำตอบของ Vereb ประมาณสามเท่า (ขออภัยแก้ไข!


อันนี้ใช้ไม่ได้ถ้าคุณต้องการนับ\rหรือ\nอักขระ tr -cd fคำตอบไม่ทำงานสำหรับการที่
bjnord

3
การนับหลายตัวอักษรเช่นa, bและcใช้:egrep egrep -o 'a|b|c' <file> | wc -l
Skippy le Grand Gourou

นอกจากนี้ระวังอย่าใช้wc -cในtrคำตอบเนื่องจากgrepเอาต์พุตทีละบรรทัดwcจะนับจุดสิ้นสุดของบรรทัดเป็นอักขระ (ดังนั้นจึงเพิ่มจำนวนอักขระเป็นสองเท่า)
Skippy le Grand Gourou

@bjnord ตกลงสำหรับ\rแต่จะนับ\nทำไมไม่ใช้wc -l?
Skippy le Grand Gourou

67

เร็วยิ่งขึ้น:

tr -cd f < file | wc -c

เวลาสำหรับคำสั่งนี้กับไฟล์ที่มีอักขระที่ค้นหา 4.9 MB และ 1100000 เกิดขึ้น:

real   0m0.089s
user   0m0.057s
sys    0m0.027s

เวลาสำหรับคำตอบ Vereb กับecho, cat, trและbcไฟล์เดียวกัน:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

เวลาสำหรับคำตอบ Rob Hruska ด้วยtr, sedและwcไฟล์เดียวกัน:

real   0m0.465s
user   0m0.411s
sys    0m0.080s

เวลาสำหรับ Jefromi ตอบด้วยfgrepและwcสำหรับไฟล์เดียวกัน:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 

3
การนับหลายตัวอักษรเช่นa, bและ:c tr -cd abc < file | wc -l
Skippy le Grand Gourou

คุณแน่ใจไหม? ไม่คิดว่าจะเป็นtr -cd abc < file | wc -cแทน
Mithun B

10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

โดยที่ A คืออักขระ

เวลาสำหรับคำสั่งนี้กับไฟล์ที่มีอักขระที่ค้นหา 4.9 MB และ 1100000 เกิดขึ้น:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

1
นี้ได้รับประมาณหนึ่งในสามเร็วขึ้นถ้าคุณจะออกจากที่ไม่จำเป็นcats ให้ชื่อไฟล์เป็นอาร์กิวเมนต์ไปยังและwc tr
Cascabel

1
หากคุณต้องการเพิ่มประสิทธิภาพให้อ่านไฟล์เพียงครั้งเดียว: echo $ (stat -c% s <file>) - $ (cat <file> | tr -d 'A' | wc -c) | bc
Vereb

@Vereb - tr อ่านเท่านั้นstdinแต่สามารถcattr -d 'A' < <file> | wc ...
piped ได้

7

หากสิ่งที่คุณต้องทำคือนับจำนวนบรรทัดที่มีอักขระของคุณสิ่งนี้จะได้ผล:

grep -c 'f' myfile

อย่างไรก็ตามจะนับการเกิด "f" หลายครั้งในบรรทัดเดียวกันเป็นการจับคู่ครั้งเดียว


4

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

การแทนที่ "A" ทั้งสองครั้งด้วยอักขระของคุณและ "file" ด้วยไฟล์อินพุตของคุณ

  • tr -d '\n' < file: ลบบรรทัดใหม่
  • sed 's/A/A\n/g: เพิ่มขึ้นบรรทัดใหม่ทุกครั้งที่เกิด "A"
  • wc -l: นับจำนวนบรรทัด

ตัวอย่าง:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.