파일 a.txt
에는 약 100,000개의 단어가 있으며 각 단어는 새 줄에 있습니다.
july.cpp
windows.exe
ttm.rar
document.zip
파일에는 b.txt
한 줄씩 한 단어씩 150,000개의 단어가 있습니다. 일부 단어는 file 에서 가져온 것이지만 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
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
)