使用awk根据4列的值删除行

0 perl awk

我有一个巨大的床文件(数百万行),它是这样的:

chr10   0   200 E5  E5  E5  E5
chr10   200 400 E2  E1  E5  E3
chr10   400 600 E5  E2  E5  E1
chr10   600 800 E5  E5  E5  E5
chr10   800 1000    E4  E2  E5  E5
chr10   1000    1200    E5  E5  E5  E5
chr10   1200    1400    E5  E5  E6  E3
....
Run Code Online (Sandbox Code Playgroud)

在这个文件中,我只想删除列4,5,6和7的值为"E5"的所有行.

所以这个例子的输出应该是这样的

chr10   200 400 E2  E1  E5  E3
chr10   400 600 E5  E2  E5  E1
chr10   800 1000    E4  E2  E5  E5
chr10   1200    1400    E5  E5  E6  E3
Run Code Online (Sandbox Code Playgroud)

这可能很容易,但我还没弄清楚.我使用循环编写了一个perl脚本来执行此操作,但由于它的大小,它显然会在一段时间后崩溃.我一直在寻找一个awk命令来做到这一点,但找不到一个有效.

有谁知道如何轻松地做到这一点?

提前致谢!

jas*_*jas 6

$ awk '!($4 == "E5" && $5 == "E5" && $6 == "E5" && $7 == "E5")' eee.txt
chr10   200 400 E2  E1  E5  E3
chr10   400 600 E5  E2  E5  E1
chr10   800 1000    E4  E2  E5  E5
chr10   1200    1400    E5  E5  E6  E3
Run Code Online (Sandbox Code Playgroud)

编辑:

实际上,我发现上述解决方案优雅,缺乏优雅,因为它显示了awk使用其最基本功能的有用性; 它是如何直接表达一个像OP给出的直截了当的问题.但是这位评论者提出了一个很好的观点,即-v除了最常见的解决方案外,使用是一种改进:

awk -v val=E5 '!($4 == val && $5 == val && $6 == val && $7 == val)' eee.txt
Run Code Online (Sandbox Code Playgroud)

  • 我会使用`-vx ="E5"`来获得额外的DRY-ness (2认同)