두 개의 txt 파일을 비교해야 합니다. 두 txt 파일 모두 각 줄에 대한 항목을 포함합니다. 한 줄에 항목이 하나씩 있습니다. 새 파일에는 이전 파일에서 누락된 항목이 포함되어 있습니다. diff
사용해 보았지만 vimdiff
행 순서가 다를 수 있으므로 작동하지 않습니다.
예를 들어:
오래된 파일
alpha
beta
gama
새로운 파일
delta
omega
beta
alpha
gama
rho
phi
diff
행 1을 행 1과 비교 하고 vimdiff
행 2를 행 2와 비교합니다. 두 파일을 모두 정렬하더라도 "alpha , beta, rho" 대 "alpha, beta"와 같이 정렬된 버전 사이에 새 항목을 추가할 수 있기 때문에 비교가 성공하지 못합니다. , 감마, 로”.
새 파일에는 있지만 이전 파일에는 없는 항목 목록을 어떻게 얻을 수 있나요?
답변1
start cmd:> awk 'FNR == NR { oldfile[$0]=1; };
FNR != NR { if(oldfile[$0]==0) print; }' file1 file2
delta
omega
rho
phi
답변2
나는 사용할 것이다grep
grep -Fxvf oldfile newfile
-F
: 고정 문자열 패턴 사용(메타 문자 없음)
-x
: 전체 줄과 일치합니다(하위 문자열 아님).
-f oldfile
: 일치하는 문자열을 읽습니다.oldfile
-v
:일치를 반대로 합니다. 즉, 찾을 수 없는 문자열을 인쇄합니다.oldfile
답변3
더 짧은 awk
명령:
awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2
null일 수 있는 경우 로 file1
바꿉니다 .NR==FNR
FILENAME==ARGV[1]
grep -Fxvf file2 file1
대용량 파일의 경우 매우 느림:
$ jot -r 10000 1 100000 >file1;jot -r 10000 1 100000 >file2
$ time awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2 >/dev/null
0.015
$ time grep -Fxvf file2 file1 >/dev/null
36.758
$ time comm -13 <(sort file1) <(sort file2)>/dev/null
0.173
중복 행을 제거해야 하는 경우 다음을 사용하세요.
awk 'NR==FNR{a[$0];next}!b[$0]++&&!($0 in a)' file1 file2
또는
comm -13 <(sort file1) <(sort -u file2)
답변4
python
이를 수행하는 방법이 필요한 경우 .
#!/usr/bin/env python3.4
oldfp = open('/tmp/tmp.Q3JiYGY6fs/oldfile')
newfp = open('/tmp/tmp.Q3JiYGY6fs/newfile')
old = set([ x.strip() for x in oldfp.readlines() ])
new = set([ x.strip() for x in newfp.readlines() ])
print('Lines that are present only in newfile are \n{}\n\n{} '.format(42*'-', '\n'.join(list(new - old))))
출력은 다음과 같습니다
Lines that are present only in newfile are
------------------------------------------
phi
rho
omega
delta