Làm cách nào để xóa các từ trong tệp txt, tồn tại trên một tệp txt khác?


8

Tệp a.txtcó khoảng 100k từ, mỗi từ nằm trong dòng mới

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

Tệp b.txtcó 150k từ, một từ theo dòng - một số từ là từ tệp a.txt, nhưng một số từ mới:

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

Làm cách nào tôi có thể hợp nhất các tệp này thành một, xóa tất cả các dòng trùng lặp và giữ các dòng mới (các dòng tồn tại a.txtnhưng không tồn tại b.txtvà ngược lại)?


Bạn có vui khi sử dụng trăn không?
Tim

2
@ MikołajBartnicki Unix.SE có lẽ sẽ là một nơi tốt hơn để hỏi
Glutimate

1
Kasia, tôi đã phạm sai lầm trong câu trả lời của mình, đó là lý do tại sao tôi xóa nó. Tôi đang làm việc trên một cái mới.

2
@Glutanimate Câu hỏi này là hoàn toàn tốt ở đây.
Seth

1
@Glutanimate Ah, tôi xin lỗi, tôi đã bỏ lỡ nhận xét đó bằng cách nào đó.
Seth

Câu trả lời:


13

Có một lệnh để làm điều này : comm. Như đã nêu man comm, nó rất đơn giản:

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

Lưu ý rằng commhy vọng nội dung tệp sẽ được sắp xếp, vì vậy Bạn phải sắp xếp chúng trước khi gọi commchúng, giống như vậy:

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

Vì vậy, để tổng hợp:

sort a.txt > as.txt

sort b.txt > bs.txt

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

Sau các lệnh trên, Bạn sẽ có các dòng dự kiến ​​trong result.txttệp.


cảm ơn bạn, nó hoạt động như một nét duyên dáng Tái bút đến zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Kate-Kasia

2

Đây là một đoạn script python3 ngắn, dựa trên câu trả lời của Germar , sẽ hoàn thành việc này trong khi vẫn giữ nguyên b.txtthứ tự chưa được sắp xếp.

#!/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
Man, bạn đang bắn một con muỗi với một khẩu pháo hải quân!

:-) Bạn đúng. Tôi đã bỏ lỡ 'k' trong 100k
Germar

1

Hãy xem commlệnh 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)

Vì vậy, ví dụ bạn có thể làm

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

(dòng duy nhất b.txt)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.