Grep: นับจำนวนการแข่งขันต่อบรรทัด


26

ฉันพยายามรับจำนวนการแข่งขัน (ในกรณีนี้{หรือ}) ในแต่ละบรรทัดของไฟล์. tex

ฉันรู้ว่าการ-oตั้งค่าสถานะส่งกลับเฉพาะการจับคู่ แต่คืนการจับคู่แต่ละรายการในบรรทัดใหม่แม้รวมกับการ-nตั้งค่าสถานะ ฉันไม่รู้อะไรเลยที่ฉันสามารถส่งผ่านสิ่งนี้เพื่อนับจำนวนซ้ำ การ-cตั้งค่าสถานะจะส่งกลับจำนวนการแข่งขันทั้งหมดในไฟล์ทั้งหมด - บางทีฉันอาจไปป์ไลน์ทีละบรรทัดเพื่อ grep?

คำตอบ:


27
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

ผลลัพธ์จะเป็นดังนี้:

3 1
1 2

ความหมายที่ 3 เกิดขึ้นในบรรทัดแรกและ 1 ในสอง

ที่นำมาจาก/programming//a/15366097/3378354


ขอบคุณ - google พบ regex จำนวนมากที่นิยมใน SU แต่ไม่ใช่อันนั้นใน SO ซึ่งดูเหมือนจะไม่มีแท็ก regex sortไม่จำเป็นอย่างเคร่งครัดเป็นผลผลิตของ grep จะเรียงตามจำนวนบรรทัด uniqแต่ผมคิดว่ามันเป็นวิธีปฏิบัติที่ดีก่อน
Chris H

2
อาจไม่ได้ติดแท็กregexเนื่องจาก regex เป็นส่วนที่ง่าย
Tom Zych

จำเป็นจริงๆsort -nหรือ? มันไม่ได้ออกมาในการสั่งซื้อหมายเลขบรรทัดหรือไม่
Tom Zych

คุณพูดsort -nถูกไม่จำเป็น ขอบคุณ
Moebius

@ TomZych มันกลับกลายเป็นว่าคุณพูดถูก แต่ฉันรู้ว่าฉันอาจไม่ได้ถาม กระโดดจิตจาก grep เพื่อแท็ก: regex อาจเป็นบิตมากเกินไปแม้ว่า
Chris H

3

หลังจากอ่านวิธีแก้ปัญหาต่าง ๆ แล้วฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดในการแก้ไขปัญหา:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

3
ทางออกที่ดีที่สุดในความคิดของฉัน grep -o "matchingString" <<< $i | wc -lอาจจะง่ายมากขึ้นโดยการลดโดยหนึ่งท่อ:
Benjamin W.

1
นี่จะเป็นคำสั่งของขนาดที่ช้ากว่าตัวเลือกอื่น ๆ แม้ว่า
Rahul

1

ใช้grepข้อกำหนดหรือไม่? นี่คือทางเลือก:

sed 's / [^ {}] // g' your_file | awk '{พิมพ์ NR ความยาว}'

sedแถบออกทุกตัวละครอื่น ๆ กว่า{และ} (คือเหลือเพียง{และ}ตัวอักษร) แล้วawkนับตัวละครในแต่ละบรรทัด (ซึ่งเป็นเพียง{และ}ตัวอักษร) ในการปราบปรามเส้นที่ไม่มีการแข่งขัน

sed 's / [^ {}] // g' your_file | awk '/./ {พิมพ์ NR ความยาว}'

โปรดทราบว่าโซลูชันของฉันถือว่า (จำเป็น) ว่าสตริงที่คุณค้นหานั้นเป็นอักขระตัวเดียว คำตอบของ Moebius นั้นปรับให้เข้ากับสายอักขระหลายตัวได้ง่ายขึ้น นอกจากนี้คำตอบของเรายังไม่รวมถึงการอ้างถึงตัวละครหรือสายอักขระที่น่าสนใจ เช่น,

{ "nullfunc() {}" }

จะถือว่ามีอักขระสี่ตัว


grepไม่ได้เป็นข้อกำหนดจริงๆมันเป็นเพียงที่ฉันเริ่มมองหาวิธีการแก้ปัญหาเพราะมันทำให้ฉันมีบางสิ่งบางอย่างใกล้ชิด ฉันไม่เคยต้องการ awk ดังนั้นถ้าฉันไม่ได้ใช้คำตอบข้างต้นฉันได้ใช้สิ่งนี้เป็นโอกาสในการทดสอบ - ฉันอาจจะยัง สิ่งที่ฉันไม่ชัดเจน (แต่ไม่มีผลต่อคำตอบ) คือฉันต้องการเรียกใช้สคริปต์หนึ่งครั้งต่อวงเล็บเพื่อช่วยฉันติดตามความไม่ตรงกัน (ในแหล่ง LaTeX ที่นี่สำหรับตาราง) ที่คู่ส่วนใหญ่เกิดขึ้นใน บรรทัดเดียว
Chris H

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดย“ เรียกใช้สคริปต์หนึ่งครั้งต่อวงเล็บ” แต่ถ้าคุณต้องการติดตามวงเล็บปีกกาที่ไม่ตรงกันคุณอาจต้องการลองบางอย่างเช่นsed 's/{[^{}]*}//g' your_file | grep –n '[{}]'ที่sedแถบคู่ (จับคู่) หากคุณมีคู่ซ้อนกันให้ใช้sed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …ทำซ้ำs/{[^{}]*}//gหลาย ๆ ครั้งเช่นเดียวกับการทำรังที่ลึกที่สุดของคุณ
สกอตต์

ฉันหมายถึงรัน `sed 's / [^}] // g' your_file | awk '{พิมพ์ NR ยาว}' และ 's / [^ {] // g' your_file | awk '{พิมพ์ NR ความยาว}' แน่นอนว่าฉันมีการทำรังและการทำงานในระดับที่ลึกที่สุดดูเหมือนงานน่าเบื่อ เปลี่ยนหลายบรรทัดให้เป็นกำมือ (มีบางกรณีที่วงเล็บปีกกาจับคู่มากกว่าหลายบรรทัดด้วยเหตุผลที่ถูกต้อง) ทำงานได้ดี (ฉันใช้ jedit ซึ่งเน้นการจับคู่วงเล็บ - สำหรับวงเล็บประเภทใดที่เข้าใจ - ดังนั้นฉันจึงทำจริงๆ ต้อง จำกัด ให้แคบลง)
Chris H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.