다른 파일의 키 값을 기반으로 파일에서 줄을 삭제하는 방법

다른 파일의 키 값을 기반으로 파일에서 줄을 삭제하는 방법

파일 1이 있습니다.

1   a   aa
2   b   bb
3   a   aa
4   b   bb
5   a   aa
6   b   bb
7   a   aa
8   b   bb

파일 2:

1
2
5

file1의 값이 file2에 있는 file1의 모든 행을 삭제해야 합니다.

답변1

sort -b예를 들어, 두 파일이 첫 번째 열에서 사전순으로 정렬되어 있다고 가정합니다.

$ join -v 1 file1 file2
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

이는 유틸리티를 사용하여 첫 번째 열이 의 값과 일치하지 않는 모든 행을 join추출합니다 .file1file2

기본 동작은 join두 파일의 첫 번째 열을 기반으로 INNER JOIN을 생성하는 것이지만 -v 1첫 번째 파일에서 페어링할 수 없는 행을 얻습니다.

답변2

GNU로 이것을 시도해 보세요 awk:

솔루션 1:

$ awk 'NR==FNR {a[$0]} FNR!=NR {printf("%s",!($1 in a)? $0"\n": "")}' file2 file1
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

첫 번째 솔루션은 블록 !($1 in a)? $0"\n": ""내부에 삼항 연산자가 있어 불필요하게 고안된 것처럼 보입니다 printf. 나는 단지 일반적인 목적으로 이를 언급하는 것입니다. 즉, 시나리오에 따라 필요하지 않은 줄을 제거하는 것이 아니라 교체하려는 경우 빈 string my_string에 넣을 수 있습니다 .my_string\n""

솔루션 2:

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a) {print $0}' file2 file1

이는 다음과 같이 더욱 단순화될 수 있습니다.

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a)' file2 file1

awk기본적으로 전체 레코드()가 인쇄되기 때문입니다 .$0

man awkawk특정 설치 스타일에 관계없이 훌륭한 소개가 제공됩니다. 서핑 후에도 여전히 궁금한 점이 있으면 구체적인 정보를 요청하세요.

누군가가 이것을 더 쉽게 보이게 하는 방법을 찾을 것이라고 확신합니다. ;-)

답변3

awk 'NR==FNR{a[$1];next}!($1 in a){print $0}' file2 file1

산출

3   a   aa
4   b   bb
6   b   bb
7   a   aa
8   b   bb

관련 정보