ระบุกลุ่มข้อความที่ซ้ำกันภายในไฟล์


10

มีวิธีที่สะดวกในการระบุการทำซ้ำหรือใกล้บล็อคข้อความที่ซ้ำกันภายในไฟล์หรือไม่?

ฉันต้องการใช้สิ่งนี้เพื่อระบุการทำสำเนารหัส ดูเหมือนว่ามีโปรแกรมพิเศษที่มีความสามารถนี้ แต่ฉันไม่ต้องการเข้าไปเกี่ยวข้อง

ฉันหวังว่าจะมีเครื่องมือคล้ายกับ diff ที่จะสามารถจัดเรียง "ภายในไฟล์" diff ยิ่งไปกว่านั้นจะเป็นไฟล์ภายใน vimdiff


คุณไม่vimdiffได้ทำอะไรที่นี่
slm

เนื่องจากมีไฟล์เดียวที่เกี่ยวข้อง ฉันไม่ทราบวิธีการใช้ vimdiff ในส่วนต่าง ๆ ของไฟล์เดียวกัน
Praxeolitic

ฉันเห็นว่าฉันพลาดว่าเป็นไฟล์เดียว
slm

คำตอบ:


13

หากการเปรียบเทียบแบบบรรทัดต่อบรรทัดเป็นที่ยอมรับแล้วสิ่งต่อไปนี้จะบอกว่าบรรทัดใดที่ซ้ำกันในไฟล์textและจำนวนครั้งที่แต่ละรายการปรากฏขึ้น:

sort text | uniq -c | grep -vE '^\s*1 '

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

$ cat text
alpha
beta
alpha
gamma
alpha
beta
$ sort text | uniq -c | grep -vE '^\s*1 '
      3 alpha
      2 beta

การใช้เครื่องมือ unix ปกตินี้สามารถขยายได้โดยสมมติว่ารูปแบบการทดสอบอินพุตนั้นไม่ซับซ้อนเกินไปสำหรับการเปรียบเทียบแบบย่อหน้าต่อย่อหน้าหรือประโยคต่อประโยค

การค้นหาย่อหน้าซ้ำ

สมมติว่าไฟล์ของเราtextมี:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

คำสั่งต่อไปนี้ระบุว่าย่อหน้าใดปรากฏขึ้นมากกว่าหนึ่งครั้ง:

$ awk -v RS=""  '{gsub(/\n/," "); print}' text | sort | uniq -c | grep -vE '^\s*1 '
      2 This is a paragraph.

สิ่งนี้ใช้awkเพื่อแยกข้อความออกเป็นย่อหน้า (คั่นด้วยบรรทัดว่าง) แปลงบรรทัดใหม่เป็นช่องว่างจากนั้นผ่านเอาต์พุตหนึ่งบรรทัดต่อย่อหน้าเพื่อเรียงลำดับและ uniq สำหรับการนับย่อหน้าที่ซ้ำกัน

ดังกล่าวข้างต้นได้รับการทดสอบ wtih awkGNU สำหรับคนอื่นawkวิธีกำหนดบรรทัดว่างตามขอบเขตของย่อหน้า (บันทึก) อาจแตกต่างกัน


1
ฉัน upvote ครั้งละหลายบรรทัด
Praxeolitic

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