Как удалить слова из текстового файла, который существует в другом текстовом файле?

8

Файл a.txtсодержит около 100 тыс. Слов, каждое слово в новой строке

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

Файл b.txtсодержит 150 000 слов, одно слово за строкой - некоторые слова из файла a.txt, но некоторые слова являются новыми:

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

Как я могу объединить эти файлы в один, удалить все повторяющиеся строки и сохранить строки, которые являются новыми (строки, которые существуют, a.txtно не существуют b.txt, и наоборот)?

Kate-Кася
источник
Будете ли вы рады использовать Python?
Тим
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. к zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Кейт-Кася
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)
Germar
источник
2
Чувак, ты стреляешь в комара из морской пушки!
:-) Вы правы. Я пропустил 'k' в 100k
Джермар
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)

steeldriver
источник