我想知道如何根据每个感兴趣的列中的特定值来过滤具有多个列的表。
我这里有这个例子:
Chr1 16644 0 0 1 1
Chr1 16645 0 0 1 1
Chr1 16646 0 0 1 1
Chr1 16647 0 0 1 1
Chr1 16648 0 0 1 1
Chr1 16649 0 0 1 1
Chr1 16650 0 0 1 1
Chr1 16651 0 0 1 1
Chr1 16782 0 0 0 0
Chr1 16783 0 0 0 0
Chr1 16784 0 0 0 0
Chr1 16785 0 0 0 0
Chr1 16786 0 0 1 1
Chr1 16787 0 0 1 1
Chr1 16788 0 0 1 1
Chr1 16789 0 0 1 1
Chr1 16790 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
我想删除所有第 3、4、5、6 列中包含零的行。
我已经尝试过了
cat STARsamples_read_depth.txt | awk '$3 != 0 && $4 != 0&& $5 != 0 && $6 != 0' | less
Run Code Online (Sandbox Code Playgroud)
但它也删除了其中只有某些列为零的行,而不是所有四列!
有办法做到吗?
谢谢
阿萨
使用任何 awk,您都可以测试您感兴趣的字段的串联是否会产生非零数字:
$ awk '($3$4$5$6)+0' file
Chr1 16644 0 0 1 1
Chr1 16645 0 0 1 1
Chr1 16646 0 0 1 1
Chr1 16647 0 0 1 1
Chr1 16648 0 0 1 1
Chr1 16649 0 0 1 1
Chr1 16650 0 0 1 1
Chr1 16651 0 0 1 1
Chr1 16786 0 0 1 1
Chr1 16787 0 0 1 1
Chr1 16788 0 0 1 1
Chr1 16789 0 0 1 1
Chr1 16790 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
或者如果您出于某种原因想单独测试每个字段,那么:
$ awk '{for (i=3; i<=6; i++) if ($i != 0) { print; next } }' file
Chr1 16644 0 0 1 1
Chr1 16645 0 0 1 1
Chr1 16646 0 0 1 1
Chr1 16647 0 0 1 1
Chr1 16648 0 0 1 1
Chr1 16649 0 0 1 1
Chr1 16650 0 0 1 1
Chr1 16651 0 0 1 1
Chr1 16786 0 0 1 1
Chr1 16787 0 0 1 1
Chr1 16788 0 0 1 1
Chr1 16789 0 0 1 1
Chr1 16790 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
如果您的输入可能不是问题中所示的整数(请参阅注释),则使用上面的第二个脚本,或者您可以将其设置为字符串,而不是连接上的数字比较:
awk '($3$4$5$6) != "0000"' file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |