아래와 같이 두 개의 파이프로 구분된 파일이 있습니다.
파일 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
join
GNU 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,$2
1
!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