![跨 4 列的条件 awk](https://linux22.com/image/65014/%E8%B7%A8%204%20%E5%88%97%E7%9A%84%E6%9D%A1%E4%BB%B6%20awk.png)
我有一个包含 9 列的制表符分隔文件,如下所示:
1 25555818 T 14 0 0 0 14 0:0:0:14
2 25555819 T 14 7 0 0 7 7:0:0:7
3 25555820 G 13 0 0 13 0 0:0:13:0
4 25555821 A 0 0 0 0 0 0:0:0:0
5 25555822 G 11 0 0 11 0 0:0:0:0
6 25555823 T 11 2 0 0 9 2:0:0:9
7 25555824 T 11 0 0 0 11 0:0:0:11
8 25555825 G 11 5 0 3 3 5:0:3:3
我想仅保留第 5、6、7、8 列中至少有两个大于零的值的行。所以在上面的例子中,我想要保留的行是第 2,6,8 行。换句话说,如果第 5-8 列中至少有 3 个零,则应丢弃该行。
问题是第 9 列是合并第 5-8 列的产物,因此它也可以用于模式匹配;然而,与之前一样,该模式不一定是 3 个连续的零。 4 个值中必须至少有 3 个零。
答案1
这是一种方法:
awk 'BEGIN{FS="\t"} (($5!=0)+($6!=0)+($7!=0)+($8!=0))>=2'
还有一个针对 C 黑客的简洁变体:
awk -F $'\t' '(!!$5+!!$6+!!$7+!!$8)>=2'