我有一个巨大的床文件(数百万行),它是这样的:
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命令来做到这一点,但找不到一个有效.
有谁知道如何轻松地做到这一点?
提前致谢!
$ 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)
归档时间: |
|
查看次数: |
645 次 |
最近记录: |