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

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

세 개의 파일이 있는데 file1.txt형식이 동일합니다(데이터 유형이 동일하고 열 수가 동일함).file2.txtfile3.txt

컬럼 2와 컬럼 3을 각각 비교하여 출력 파일 file1.txt에 존재하지 않는 레코드를 선택하고 싶습니다 file2.txt. 이 작업을 수행하는 방법을 도와주실 수 있나요?file3.txtout.txt

입력 예:

file1.txt

abc 1 a f11 f13 f14 
abd 2 b f12 f14 f13  
abe 4 d f13 f16 f12 
acf 6 s f14 f15 f19

file2.txt

 abc 1 a f21 f23 f24 
 abd 1 b f21 f24 f23  
 abe 4 d f24 f26 f22 
 acf 6 s f23 f25 f29

file3.txt

 abc 1 a f31 f33 f34 
 abd 3 b f31 f34 f33  
 acf 6 s f33 f35 f39 
 abe 3 d f34 f36 f32

원하는 출력

out.txt

 abd 2 b f12 f14 f13 

이 행 외에 다른 행이 에 존재합니다 file2.txt.file3.txt

이 게시물이 업무에 유용하다고 생각합니다세 개의 파일,비교하다두 개의 파일.

답변1

네가 그렇게 좋아한다면awk

awk '
FILENAME != ARGV[3] {
    m[$2,$3] = 1
    next
    }
!(($2,$3) in m)
' file3.txt file2.txt file1.txt > out.txt

나한테는 쉬운 일이야

cut -d" " -f 2,3 file2.txt file3.txt | grep -v -f - file1.txt > out.txt

답변2

가능한 해결책 awk:

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = $0;
    next;
}
FILENAME == ARGV[2] {
    if (!(($2,$3) in m)) {
        m[$2,$3] = $0;
    }
    next;
}
{
    if (!(($2,$3) in m)) {
        print $0 >"out.txt";
    }
}' file3.txt file2.txt file1.txt

먼저 첫 번째 파일을 읽고 열 2와 3에 대한 키가 포함된 배열을 만듭니다.
그런 다음 두 번째 파일을 읽고 열 2와 3의 키가 첫 번째 배열에 있는지 확인하고, 없으면 배열에 추가합니다.
마지막으로 첫 번째 파일을 읽고 배열에 키가 있는지 확인합니다. 그렇지 않은 경우 관심 있는 행이 바로 그 행입니다.

출력.txt첫 번째 파일에는 다른 두 파일에 나타나지 않는 줄이 포함되어야 합니다.

abd 2 b f12 f14 f13

관련 정보