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

时间:2016-01-14 17:07:34

标签: perl awk

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

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

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

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

window.onbeforeunload = function(){
    var scrollTo = calculateNextLoadPosition();
    //below function validates & calls localStorage.setItem(name,value);
    storeLocalData("scrollTo",scrollTo);
    console.log("Stored scrollPosition "+ scrollTo);
};

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

有没有人知道如何轻松完成这项工作?

提前致谢!

2 个答案:

答案 0 :(得分: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

修改

我实际上发现上述解决方案优雅,缺乏优雅,因为它显示了awk使用其最基本功能的有用性;它是如何直接表达一个像OP给出的直截了当的问题。但是,评论者指出,使用-v对任何解决方案都是一种改进:

awk -v val=E5 '!($4 == val && $5 == val && $6 == val && $7 == val)' eee.txt

答案 1 :(得分:3)

$ 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(或sed):

$ 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