두 파일을 비교하고 첫 번째 열과 두 번째 열을 기반으로 두 번째 파일에서 일치하지 않는 행을 가져옵니다.

두 파일을 비교하고 첫 번째 열과 두 번째 열을 기반으로 두 번째 파일에서 일치하지 않는 행을 가져옵니다.

아래와 같이 두 개의 파이프로 구분된 파일이 있습니다.

파일 1

TEST|123456
TEST|123457
TEST|123458
TEST|123459
TEST|123460

파일 2

TEST|123456|RAY|DOE||
TEST|123457|JANE|DOE||
TEST|123458|ROSE|DAWN||
TEST|123459|GEORGE|BRID||
TEST|123460|RALPH|DOE||
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

파일 3 - 원하는 출력

TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

file1과 file2의 첫 번째 열과 두 번째 열을 키로 사용하여 file2에서 일치하지 않는 행을 가져오고 싶습니다.

답변1

joinGNU coreutils에는 -v두 소스 파일 중 하나에서 페어링할 수 없는 줄을 인쇄하는 옵션이 있습니다. 이것을 사용하여 일치를 반전시키는 것이 잘 작동합니다.

$ cat file1.txt
TEST|123456
TEST|123457
TEST|123458
TEST|123459
TEST|123460

$ cat file2.txt
TEST|123456|RAY|DOE||
TEST|123457|JANE|DOE||
TEST|123458|ROSE|DAWN||
TEST|123459|GEORGE|BRID||
TEST|123460|RALPH|DOE||
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

$ join -t '|' -j 2 -o '2.1,2.2,2.3,2.4' -v 2 file1.txt file2.txt
TEST|123461|JOHN|DOE
TEST|123462|STEVE|SMITH

답변2

노력하다:

$ awk -F'|' 'FNR==NR{a[$1,$2]=1; next}  !a[$1,$2]' file1 file2
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

어떻게 작동하나요?

  • -F'|'awk에게 |필드 구분 기호로 사용하도록 지시합니다.

  • FNR==NR{a[$1,$2]=1; next}

    첫 번째 파일( )에 속하는 행의 경우 이는 awk에게 key 및 value 를 사용하여 연관 배열 FNR==NR에 항목을 추가하도록 지시합니다 .a$1,$21

  • !a[$1,$2]

    이는 awk에게 !a[$1,$2]true인 모든 행을 인쇄하도록 지시합니다. !이는 논리적 부정 이므로 a[$1,$2]false(0)인 행을 인쇄하는 것을 의미합니다.

    이는 우리가 설정한 줄을 a[$1,$2]=1건너뛰게 된다는 뜻입니다(인쇄되지 않음). 다른 줄이 인쇄됩니다.

답변3

Grep은 선택적으로 파일에서 일치시킬 정규식을 얻습니다.
첫 번째 파일을 정규식으로 만들려면 ^각 줄의 시작 부분에 a를 추가하면 됩니다. 예를 들어 sed 명령을 사용하여 이 작업을 수행할 수 있습니다 sed 's/.*/^&/' file1.

그런 다음 sed의 출력을 다음과 같이 grep에 공급합니다(ksh, zsh, bash).

grep -vf <(sed 's/.*/^&/' file1) file2

답변4

소프트웨어 도구 방법:

sort -r file[12] | uniq -u -w11 | tac

관련 정보