วิธีลบคำจากไฟล์ txt มีอยู่ในไฟล์ txt อื่นได้อย่างไร


8

ไฟล์a.txtมีคำประมาณ 100k แต่ละคำอยู่ในบรรทัดใหม่

july.cpp
windows.exe
ttm.rar
document.zip

ไฟล์b.txtมี 150k คำหนึ่งคำต่อบรรทัด - บางคำมาจากไฟล์a.txtแต่บางคำเป็นคำใหม่:

july.cpp    
NOVEMBER.txt    
windows.exe    
ttm.rar    
document.zip    
diary.txt

ฉันจะรวมไฟล์นี้เป็นไฟล์เดียวลบบรรทัดที่ซ้ำกันทั้งหมดและเก็บบรรทัดที่ใหม่ (บรรทัดที่มีอยู่a.txtแต่ไม่มีอยู่ในb.txtและในทางกลับกัน)


คุณยินดีที่จะใช้ python ไหม?
ทิม

2
@ MikołajBartnicki Unix.SEอาจเป็นสถานที่ที่ดีกว่าที่จะถาม
ลูตานิเมท

1
Kasia ฉันทำผิดพลาดในคำตอบของฉันนั่นคือเหตุผลที่ฉันลบมัน ฉันกำลังทำงานกับใหม่

2
@Glutanimate คำถามนี้ดีมากที่นี่
เซท

1
@ Glutanimate อาฉันขอโทษฉันพลาดความเห็นไปแล้ว
เซ

คำตอบ:


13

commมีคำสั่งการทำเช่นนี้คือ: ตามที่ระบุในman commมันง่ายธรรมดา:

   comm -3 file1 file2
          Print lines in file1 not in file2, and vice versa.

โปรดทราบว่าcommคาดว่าจะมีการเรียงลำดับเนื้อหาของไฟล์ดังนั้นคุณต้องเรียงลำดับก่อนเรียกcommพวกเขาเช่นเดียวกับที่:

sort unsorted-file.txt > sorted-file.txt

ดังนั้นเพื่อสรุป:

sort a.txt > as.txt

sort b.txt > bs.txt

comm -3 as.txt bs.txt > result.txt

หลังจากคำสั่งด้านบนคุณจะมีบรรทัดที่คาดหวังในresult.txtไฟล์


ขอบคุณมันใช้งานได้เหมือนมีเสน่ห์ PS to zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Kate-Kasia

2

นี่คือสคริปต์ python3 สั้น ๆ ซึ่งอิงจากคำตอบของ Germarซึ่งควรทำสิ่งนี้ให้สำเร็จในขณะที่ยังคงb.txtคำสั่งที่ไม่ได้เรียงไว้

#!/usr/bin/python3

with open('a.txt', 'r') as afile:
    a = set(line.rstrip('\n') for line in afile)

with open('b.txt', 'r') as bfile:
    for line in bfile:
        line = line.rstrip('\n')
        if line not in a:
            print(line)
            # Uncomment the following if you also want to remove duplicates:
            # a.add(line)

1
#!/usr/bin/env python3

with open('a.txt', 'r') as f:
    a_txt = f.read()
a = a_txt.split('\n')
del(a_txt)

with open('b.txt', 'r') as f:
    while True:
        b = f.readline().strip('\n ')
        if not len(b):
            break
        if not b in a:
            print(b)

2
ชายคุณกำลังยิงยุงด้วยปืนใหญ่ทางเรือ!

:-) คุณถูก. ฉันพลาด 'k' ใน 100k
Germar

1

ดูที่commคำสั่งcoreutils -man comm

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

DESCRIPTION
       Compare sorted files FILE1 and FILE2 line by line.

       With  no  options,  produce  three-column  output.  Column one contains
       lines unique to FILE1, column two contains lines unique to  FILE2,  and
       column three contains lines common to both files.

       -1     suppress column 1 (lines unique to FILE1)

       -2     suppress column 2 (lines unique to FILE2)

       -3     suppress column 3 (lines that appear in both files)

ตัวอย่างเช่นคุณสามารถทำได้

$ comm -13 <(sort a.txt) <(sort b.txt)
diary.txt
NOVEMBER.txt

(บรรทัดที่ไม่ซ้ำกับb.txt)

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