มีวิธีใดบ้างใน linux / terminal ในการนับจำนวนครั้งที่ char f เกิดขึ้นในไฟล์ข้อความธรรมดา
มีวิธีใดบ้างใน linux / terminal ในการนับจำนวนครั้งที่ char f เกิดขึ้นในไฟล์ข้อความธรรมดา
คำตอบ:
แล้วสิ่งนี้ล่ะ:
fgrep -o f <file> | wc -l
หมายเหตุ: นอกจากจะจำ / ทำซ้ำและปรับแต่งได้ง่ายกว่ามากแล้วนี่ยังเร็วกว่าคำตอบของ Vereb ประมาณสามเท่า (ขออภัยแก้ไข!
\r
หรือ\n
อักขระ tr -cd f
คำตอบไม่ทำงานสำหรับการที่
a
, b
และc
ใช้:egrep
egrep -o 'a|b|c' <file> | wc -l
wc -c
ในtr
คำตอบเนื่องจากgrep
เอาต์พุตทีละบรรทัดwc
จะนับจุดสิ้นสุดของบรรทัดเป็นอักขระ (ดังนั้นจึงเพิ่มจำนวนอักขระเป็นสองเท่า)
\r
แต่จะนับ\n
ทำไมไม่ใช้wc -l
?
เร็วยิ่งขึ้น:
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
a
, b
และ:c
tr -cd abc < file | wc -l
tr -cd abc < file | wc -c
แทน
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
cat
s ให้ชื่อไฟล์เป็นอาร์กิวเมนต์ไปยังและwc
tr
stdin
แต่สามารถcat
tr -d 'A' < <file> | wc ...
หากสิ่งที่คุณต้องทำคือนับจำนวนบรรทัดที่มีอักขระของคุณสิ่งนี้จะได้ผล:
grep -c 'f' myfile
อย่างไรก็ตามจะนับการเกิด "f" หลายครั้งในบรรทัดเดียวกันเป็นการจับคู่ครั้งเดียว
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