如何使用 awk 过滤表

Ass*_*viz 1 awk filter table

我想知道如何根据每个感兴趣的列中的特定值来过滤具有多个列的表。

我这里有这个例子:

    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)

但它也删除了其中只有某些列为零的行,而不是所有四列!

有办法做到吗?

谢谢

阿萨

Ed *_*ton 6

使用任何 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)