从另一个文件中命名的文件中删除行

Joa*_*dez 5 command-line grep awk text-processing

我有以下清单:

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
Run Code Online (Sandbox Code Playgroud)

我还有另一个文件,只有第一列:

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
Run Code Online (Sandbox Code Playgroud)

我想删除命名为第二个文件的第一个文件的整行。在这种情况下,输出文件将是:

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
Run Code Online (Sandbox Code Playgroud)

(删除 NM_000022 和 NM_00023 及其对应的值)

谢谢!!

hee*_*ayl 6

awk

awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
Run Code Online (Sandbox Code Playgroud)

输入只有一列作为第一个参数的文件,将检查(第一列)成员资格的文件作为第二个参数。

  • NR==FNR {a[$0]; next},这里NR==FNR只对第一个文件成立,然后我们将每一行保存到数组中,a以便我们可以对第二个文件的第一个参数进行成员资格测试,然后我们将转到下一行而不对第二个文件进行任何进一步的操作文件

  • {if ($1 in a) next}; 1将仅对第二个文件执行,即要检查的文件,这里我们检查空格分隔的第一个参数是否在数组中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
Run Code Online (Sandbox Code Playgroud)