한 파일에서 다른 파일과 비교하여 새 줄 찾기 [중복]

한 파일에서 다른 파일과 비교하여 새 줄 찾기 [중복]

두 개의 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==FNRFILENAME==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

관련 정보