web-dev-qa-db-ja.com

別の名前のファイルから行を削除します

次のリストがあります。

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
6
heemayl

Bashループでsedを使用することもできます。

このコマンドは、file1を所定の場所に変更し(バックアップfile1.bakを作成)、file2の任意の行で始まるすべての行を削除します。

while read line ; do sed -i.bak "/$line.*/d" file1 ; done < file2
2
Byte Commander

ここで「grep」コマンドはどうですか:)

grep -Fvf oneColumnedFile listFile > outfile
1
αғsнιη