Bagaimana cara menghapus kata dari file txt, yang ada pada file txt lain?

8

File a.txtmemiliki sekitar 100 ribu kata, setiap kata ada di baris baru

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

File b.txtmemiliki 150 ribu kata, satu kata per baris - beberapa kata berasal dari file a.txt, tetapi beberapa kata baru:

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

Bagaimana saya bisa menggabungkan file ini menjadi satu, menghapus semua baris duplikat, dan menjaga baris yang baru (baris yang ada a.txttetapi tidak ada b.txt, dan sebaliknya)?

Kate-Kasia
sumber
Apakah Anda senang menggunakan python?
Tim
2
@ MikołajBartnicki Unix.SE mungkin akan menjadi tempat yang lebih baik untuk bertanya
Glutanimate
1
Kasia, saya telah membuat kesalahan dalam jawaban saya, itu sebabnya saya menghapusnya. Saya sedang mengerjakan yang baru.
2
@Glutanimate Pertanyaan ini sangat bagus di sini.
Seth
1
@Gututan Ah, maaf, entah bagaimana saya melewatkan komentar itu.
Seth

Jawaban:

13

Ada perintah untuk melakukan hal ini: comm. Sebagaimana dinyatakan dalam man comm, itu sederhana:

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

Perhatikan bahwa commmengharapkan konten file diurutkan, jadi Anda harus mengurutkannya sebelum memanggilnya comm, seperti itu:

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

Jadi ringkasnya:

sort a.txt > as.txt

sort b.txt > bs.txt

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

Setelah perintah di atas, Anda akan mengharapkan baris dalam result.txtfile.


sumber
terima kasih, ini berfungsi seperti pesona. PS. to zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Kate-Kasia
2

Berikut ini adalah skrip python3 pendek, berdasarkan jawaban Germar , yang harus menyelesaikan ini sambil tetap mempertahankan b.txturutan yang tidak disortir.

#!/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)
Lily Chung
sumber
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)
Germar
sumber
2
***, kamu menembak nyamuk dengan meriam angkatan laut!
:-) Kamu benar. Saya melewatkan 'k' dalam 100k
Germar
1

Lihatlah commperintah 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)

Jadi misalnya bisa Anda lakukan

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

(garis unik ke b.txt)

Steeldriver
sumber