두 파일을 비교해야 합니다. 열 1은 두 파일 모두에서 동일합니다. 열 2는 내가 비교하려는 것입니다. 열 2를 비교할 때 파일 2에 포함되지 않은 파일 1의 모든 행을 원합니다. 열 3은 두 파일 모두에서 다르며 열 1과 열 2가 동일한 행의 경우에도 마찬가지입니다. 출력으로 파일 1의 행에 해당 열이 포함되기를 원하기 때문에 열 3을 제거할 수 없습니다.
예는 다음과 같습니다.
파일 1
21 12340 3
21 12341 7
21 12342 2
21 12343 89
21 12349 7
파일 2
21 12340 55
21 12341 7
21 12343 89
21 12344 7
21 12346 88
21 12347 3
21 12348 37
내 결과는 다음과 같습니다
21 12342 2
21 12349 7
답변1
join
파일이 예제의 args 에 있는 것처럼 사전 정렬되어야 하므로 join
파일 순서를 유지해야 하는 경우산출, 이는 다른 접근 방식이 필요합니다. 원래 필드 간격의 너비를 유지하려고 시도하지 않습니다.
join -1 2 -2 2 -v 1 <(sort file1) <(sort file2)
산출
21 12342 2
21 12349 7
답변2
한 가지 awk
해결책:
awk '
FNR == NR {
data[ $2 ] = 1;
next;
}
FNR < NR {
if ( ! ($2 in data) ) {
print $0;
}
}
' file2 file1
결과:
21 12342 2
21 12349 7
답변3
Bash 셸에서 Python 사용:
paddy$ python -c 'import sys
with open(sys.argv[2]) as f: file2col2 = {line.split()[1] for line in f}
with open(sys.argv[1]) as f: print("".join(line for line in f
if line.split()[1] not in file2col2))
' file1.tmp file2.tmp
21 12342 2
21 12349 7
paddy$
답변4
사용 egrep
및 awk
:
egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
awk
내부의 비트는 <()
의 내용을 기반으로 패턴을 생성합니다 file2
. 이러한 패턴을 사용하여 egrep
행을 일치시키고 일치를 반전 file1
시켜 -v
일치하지 않는 행만 인쇄합니다.