awk를 사용하여 n 열에 문자열이 포함된 행을 삭제하는 방법은 무엇입니까?

awk를 사용하여 n 열에 문자열이 포함된 행을 삭제하는 방법은 무엇입니까?

다음과 같이 탭으로 구분된 파일이 있습니다.

$ cat in_file
NC_013132.1     7260299 7261429 WP_012793281.1
NC_013132.1     7270674 7270862 NC_013132.1     7270674 7270862 ID=cds5678
NC_013132.1     7573559 7574311 WP_012793549.1
NZ_CP022095.2   2809552 2809629 NZ_CP022095.2   2809552 2809629 ID=cds2731
NZ_CP022095.2   2884046 2885668 WP_003877393.1
NZ_CP022095.2   3106358 3106435 NZ_CP022095.2   3106358 3106435 ID=cds2976

열 4 또는 으로 NC시작하는 행을 삭제하고 싶습니다 NZ. 를 사용하여 이 작업을 시도했지만 awk -F '\t' '$4 != "^NC | ^NZ"' in_file성공하지 못했습니다.

출력은 다음과 같아야 합니다.

$ cat out_file
NC_013132.1     7260299 7261429 WP_012793281.1
NC_013132.1     7573559 7574311 WP_012793549.1
NZ_CP022095.2   2884046 2885668 WP_003877393.1

답변1

아래 그림처럼 간단하게 할 수 있습니다. awkwith 를 사용하면 ==동일한 리터럴 문자열 일치를 수행하게 됩니다. 여기서는 ^또는 같은 정규식 일치를 수행할 수 없습니다 $. 간단히 패턴 일치를 수행 ~하고 네거티브 일치를 활성화하여 사용할 수 있습니다 !. 여러 모드의 경우 (pat1|pat2)ERE에서 지원하는 대체 스타일을 사용하세요.

awk 'BEGIN { OFS=FS="\t" } $4 !~ /^(NZ|NC)/' file

출력을 새 파일에 쓰려면 명령 끝에 리디렉션을 추가합니다 > newfile. 파일을 수정하려면 이 답변의 단계를 따르세요.awk를 사용하여 파일을 영구적으로 변경하는 방법은 무엇입니까? ("내부" 편집, "sed -i"와 동일)

답변2

오른쪽 피연산자를 (확장) 정규 표현식으로, 왼쪽 피연산자를 문자열로 처리하는 패턴 일치 연산자 ~(또는 부정용)가 필요합니다.!~

awk -F'\t' '$4 !~ "^(NC|NZ)"' infile

또는 더 짧게:

awk -F'\t' '$4 !~ "^N[CZ]"' infile

열에 공백이 없으면 더 짧아집니다(기본 awkFS는 탭/공백이므로).

awk '$4 !~ "^N[CZ]"' infile

답변3

다음을 시도했습니다.

주문하다

awk '$4 !~ /^NC|^NZ/{print $0}' filename

산출

awk '$4 !~ /^NC|^NZ/{print $0}' o.txt
NC_013132.1     7260299 7261429 WP_012793281.1
NC_013132.1     7573559 7574311 WP_012793549.1
NZ_CP022095.2   2884046 2885668 WP_003877393.1

관련 정보