我有一个巨大的床文件(数百万行),就像这样:
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命令来做到这一点,但找不到一个有效的。
有没有人知道如何轻松完成这项工作?
提前致谢!
答案 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