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

Perl 使用awk根据4列的值删除行,perl,awk,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

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

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
....
在这个文件中,我只想删除第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
这可能很容易,但我还没弄明白。我用一个循环编写了一个perl脚本来实现这一点,但由于其庞大的规模,它显然会在一段时间后崩溃。我一直在寻找一个awk命令来执行此操作,但找不到一个有效的

有人知道如何轻松做到这一点吗

提前谢谢

$ 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
编辑

实际上,我发现上述解决方案的优雅之处在于它缺乏优雅,因为它显示了awk仅使用其最基本的功能是多么有用;它如何直接表达OP给出的简单问题。但评论员指出,使用
-v
对任何解决方案都是一种改进,但不是最一次性的解决方案:

awk -v val=E5 '!($4 == val && $5 == val && $6 == val && $7 == val)' eee.txt
您甚至可以使用grep(或sed):


我用一个循环编写了一个perl脚本来实现这一点,但由于其庞大的规模,它显然会在一段时间后崩溃。-真正地你是不是想一次把它全部装进内存?你确定文件中没有完全不同的行吗?我会使用
-v x=“E5”
来获得额外的干燥效果!很有魅力
$ awk '!/( +E5){4}$/' file
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
$ grep -Ev '( +E5){4}$' file
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