Як видалити слова з файлу txt, який існує в іншому файлі txt?


8

У файлі a.txtблизько 100 клів, кожне слово - у новому рядку

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

У файлі b.txtє 150 тис. Слів, одне слово за рядком - деякі слова є з файлу a.txt, але деякі слова є новими:

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

Як я можу об'єднати ці файли в один, видалити всі повторювані рядки та зберегти нові рядки (рядки, які існують у, a.txtале не існують b.txt, і навпаки)?


Ви були б раді використовувати пітон?
Тім

2
@ MikołajBartnicki Unix.SE , мабуть, буде кращим питанням
Glutanimate

1
Кася, я помилився у своїй відповіді, тому я її видалив. Я працюю над новим.

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, заснований на відповіді Гермара , який повинен досягти цього, зберігаючи 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

Погляньте на команду coreutils comm-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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.