次のリストがあります。
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0
そして、私は最初の列だけを持つ別のファイルを持っています:
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042
2番目のファイルとして指定されている最初のファイルの行全体を削除します。その場合、出力ファイルは次のようになります。
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
(NM_000022およびNM_00023を対応する値で削除)
ありがとう!!
awk
の場合:
awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
最初の引数として単一の列のみを使用してファイルを入力し、2番目の引数として(最初の列)メンバーシップを確認するファイルを入力します。
NR==FNR {a[$0]; next}
、ここでNR==FNR
は最初のファイルについてのみtrueになります。その後、2行目の最初の引数のメンバーシップテストを実行できるように、各行を配列a
に保存します。次に、2番目のファイルを操作せずに次の行に移動します
{if ($1 in a) next}; 1
は、確認する2番目のファイルに対してのみ実行されます。ここでは、空白で区切られた最初の引数が配列a
にあるかどうかを確認します。行全体。
例:
$ cat f1.txt
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042
$ cat f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0
$ awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
Bashループでsed
を使用することもできます。
このコマンドは、file1
を所定の場所に変更し(バックアップfile1.bak
を作成)、file2
の任意の行で始まるすべての行を削除します。
while read line ; do sed -i.bak "/$line.*/d" file1 ; done < file2
ここで「grep」コマンドはどうですか:)
grep -Fvf oneColumnedFile listFile > outfile