次のようにタブ区切りのファイルがあります。
$ 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