다음과 같이 탭으로 구분된 파일이 있습니다.
$ 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
아래 그림처럼 간단하게 할 수 있습니다. awk
with 를 사용하면 ==
동일한 리터럴 문자열 일치를 수행하게 됩니다. 여기서는 ^
또는 같은 정규식 일치를 수행할 수 없습니다 $
. 간단히 패턴 일치를 수행 ~
하고 네거티브 일치를 활성화하여 사용할 수 있습니다 !
. 여러 모드의 경우 (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
열에 공백이 없으면 더 짧아집니다(기본 awk
FS는 탭/공백이므로).
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