วิธีการนับเวลาที่ตัวละครเฉพาะปรากฏในไฟล์?


18

ตัวอย่างเช่นเราต้องการนับ"อักขระเครื่องหมายคำพูด ( ) ทั้งหมด เราแค่กังวลว่าไฟล์มีเครื่องหมายคำพูดมากกว่าที่ควร

ตัวอย่างเช่น:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

ผลลัพธ์ที่คาดหวัง:

16


คำตอบ:


26

คุณสามารถรวมtr(แปลหรือลบอักขระ) กับwc(นับจำนวนคำบรรทัดตัวอักษร):

tr -cd '"' < yourfile.cfg | wc -c

(ลบ-dอักขระทั้งหมดในcomplement ของ"แล้วนับcharacters)


20

วิธี grep :

grep -o '"' file | wc -l
16 
  • -o - ส่งออกสตริงย่อยที่ตรงกันเท่านั้น

หรือด้วยเพ่งพิศเดียว:

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - ตัวแยกเรคคอร์ดที่ว่างเปล่า (แทนที่จะขึ้นบรรทัดใหม่)

  • FPAT='"' - รูปแบบการกำหนดค่าของฟิลด์


-oเป็นส่วนขยาย GNU ที่ไม่เป็นมาตรฐานของgrepโปรแกรมอรรถประโยชน์มาตรฐาน มันไม่ได้เป็นที่กล่าวถึงในเอกสาร POSIX grepสำหรับ
Andrew Henle

4

หากสองบรรทัดในไฟล์มีเครื่องหมายคำพูดคู่จำนวนคี่ผลรวมของเครื่องหมายคำพูดคู่จะเป็นเลขคู่และคุณจะไม่พบเครื่องหมายคำพูดที่ไม่สมดุล (นี่คือสิ่งที่ฉันเข้าใจว่าคุณต้องการจะทำจริง แต่ฉันอาจผิด )

awkสคริปต์นี้รายงานบรรทัดใด ๆ ในบรรทัดอินพุตที่มีราคาเป็นจำนวนคี่:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

เราตั้งคั่นฟิลด์ ( FS) ไป"ด้วย-F'"'ซึ่งหมายความว่าถ้าบรรทัดมีจำนวนคู่ของสนามก็มีคำพูดแปลก ๆ NFคือจำนวนเขตข้อมูลในระเบียนล่าสุดและNRเป็นหมายเลขลำดับของระเบียนปัจจุบัน ("หมายเลขบรรทัด")

รับอินพุตต่อไปนี้:

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

เราได้รับ

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

สิ่งที่ต้องการ

$ grep -o '"' | wc -l

จะส่งคืน "14" สำหรับไฟล์นี้



2

BASH บริสุทธิ์

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

คือtmpอาร์เรย์? ถ้าใช่tmpอาร์เรย์คืออะไร
ทิม

@ ทิมเลขที่ tmpในตัวอย่างนี้เป็นตัวแปรเปลือกปกติ และฉันกำลัง downvoting คำตอบนี้เพราะนับจำนวนครั้งที่ตัวละครปรากฏในตัวแปร ( var) มากกว่าในไฟล์ตามที่ระบุในคำถาม
สัญลักษณ์แทน

0

ลอง:

grep -0 '"' File -c

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


1
ยินดีต้อนรับใน U&L! ดูเหมือนจะไม่ตอบคำถามจริง ๆ เพราะจะนับจำนวนบรรทัดแทนอักขระ สนับสนุนการเขียนคำตอบที่มีประสิทธิภาพอย่างยิ่งใน U&L - ดูคำตอบในศูนย์ช่วยเหลือ คุณอาจต้องการปรับปรุงอันนี้
fra-san


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.