Файл 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
, и наоборот)?
решение1
Для этого есть команда: 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
.
решение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)
решение3
#!/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)
решение4
Взгляните на 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
)