파일 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
추출합니다 .file1
file2
기본 동작은 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 awk
awk
특정 설치 스타일에 관계없이 훌륭한 소개가 제공됩니다. 서핑 후에도 여전히 궁금한 점이 있으면 구체적인 정보를 요청하세요.
누군가가 이것을 더 쉽게 보이게 하는 방법을 찾을 것이라고 확신합니다. ;-)
답변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