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

関連情報