두 파일 비교: 열 비교를 사용하면 한 파일에는 행이 있지만 다른 파일에는 행이 없습니다.

두 파일 비교: 열 비교를 사용하면 한 파일에는 행이 있지만 다른 파일에는 행이 없습니다.

두 파일을 비교해야 합니다. 열 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

사용 egrepawk:

egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1

awk내부의 비트는 <()의 내용을 기반으로 패턴을 생성합니다 file2. 이러한 패턴을 사용하여 egrep행을 일치시키고 일치를 반전 file1시켜 -v일치하지 않는 행만 인쇄합니다.

관련 정보