คำสั่ง Unix ตรวจสอบว่ามีสองบรรทัดในไฟล์เหมือนกันหรือไม่?


24

มีคำสั่ง unix ที่สามารถตรวจสอบว่ามีสองบรรทัดในไฟล์เหมือนกันหรือไม่?

สำหรับตัวอย่างพิจารณาไฟล์ sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

เราเห็นว่าประโยคนั้น

This is sentence X

ซ้ำแล้วซ้ำอีก

มีคำสั่งใด ๆ ที่สามารถตรวจจับสิ่งนี้ได้อย่างรวดเร็วหรือไม่เพื่อที่ฉันจะสามารถใช้มันได้ -

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

คำตอบ:


40

นี่เป็นวิธีหนึ่งในการรับผลลัพธ์ที่แน่นอนที่คุณต้องการ:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

คำอธิบาย:

$(sort sentences.txt | uniq -d)รายการภายในแต่ละบรรทัดที่เกิดขึ้นมากกว่าหนึ่งครั้ง ด้านนอกgrep -nFxจะดูอีกครั้งsentences.txtสำหรับการ-xจับคู่ที่ตรงกันกับเส้นใด ๆ เหล่านี้-Fและเติมหมายเลขบรรทัดของพวกเขา-n


การแก้ไขของคุณเพิ่งเอาชนะฉันจากการโพสต์คำตอบเดียวกันทั้งหมด +1
casey

ดังนั้นไวยากรณ์ $ (คำสั่ง) จึงทำงานแทนชนิดได้หรือไม่
CodeBlue

2
@CodeBlue - ใช่ มันเรียกว่าการทดแทนคำสั่ง
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtจะมีประสิทธิภาพมากขึ้นเล็กน้อยและจะหลีกเลี่ยงarg list too longปัญหาที่อาจเกิดขึ้น
Stéphane Chazelas

10

ไม่ใช่สิ่งที่คุณต้องการ แต่คุณสามารถลองรวมsortและuniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2นี่คือจำนวนการทำซ้ำที่พบสำหรับบรรทัดจากman uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

หากเนื้อหาของไฟล์ในหน่วยความจำawkดีสำหรับสิ่งนี้ ซับในมาตรฐานใน comp.lang.awk (ฉันไม่สามารถค้นหาอินสแตนซ์จากเครื่องนี้ได้ แต่มีหลายเดือน) ที่เพิ่งตรวจพบว่ามีการทำซ้ำคือการawk 'n[$0]++'นับจำนวนการเกิดค่าของแต่ละบรรทัดและพิมพ์สิ่งใด ๆ อื่น ๆ print $0กว่าครั้งแรกเพราะการกระทำเริ่มต้นคือ

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

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

แสดงเป็นหลายบรรทัดเพื่อความชัดเจนคุณมักจะใช้งานร่วมกันในการใช้งานจริง หากคุณทำเช่นนี้บ่อยครั้งคุณสามารถใส่awkสคริปต์ลงในไฟล์awk -fหรือแน่นอนว่าทุกอย่างอยู่ในเชลล์สคริปต์ เช่นเดียวกับที่ง่ายที่สุดนี้สามารถทำได้มากในทำนองเดียวกันกับawkperl -n[a]

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