Bash中使用awk删除两列数值和未达阈值的表格行
Awk按指定两列之和过滤行的实现方法
现有输入
待处理的文本表格列之间用空白分隔,内容如下:
filename w POS ID b c d h 766_V 13 73711300 rs35852582 0.03046218 0.49789916 0 0.0987395 75_S 13 73711300 rs35852582 0.03046218 0.49789916 0.09821429 0.00052521 81_Y 13 73711300 rs35852582 0.03046218 0.49789916 0.1968908 0.00105042 2151_L 13 73711300 rs35852582 0.03046218 0.49789916 0.09768908 0.00105042 2051_K 13 73711300 rs35852582 0.03046218 0.49789916 0.3105042 0.09768908 921_V 13 73711300 rs35852582 0.03046218 0.49789916 0.00105042 0.09768908 533_D 13 73711300 rs35852582 0.03046218 0.49789916 0.00105042 0.09768908 330_M 13 73711300 rs35852582 0.03046218 0.49789916 0.00105042 0.09768908 2954_A 13 73711300 rs35852582 0.03046218 0.49789916 0.00105042 0.09768908
需求说明
过滤掉b列(第5列)和d列(第7列)数值之和不足0.2的行,仅保留两列相加大于等于0.2的行,同时保留表头,预期输出如下:
filename w POS ID b c d h 81_Y 13 73711300 rs35852582 0.03046218 0.49789916 0.1968908 0.00105042 2051_K 13 73711300 rs35852582 0.03046218 0.49789916 0.3105042 0.09768908
原有代码问题
之前编写的awk命令如下,无法得到正确结果:
awk 'NR>1 {sum=0; for (i=5; i<=NF; i++) { sum+= $i } if (sum > 0.2) print}' file.txt
核心问题有三个:
- 没有处理表头行,最终输出会丢失第一行的列名
- 循环逻辑是把第5列到最后一列所有值(b、c、d、h四列)全部加总,不是只计算b、d两列的和
- 判断条件用了
>0.2,不符合需求里大于等于0.2的边界要求
正确实现代码
不需要写循环,直接取指定列计算即可,awk默认对满足判断条件的行会打印整行内容,代码如下:
awk 'NR==1{print; next} $5 + $7 >= 0.2' file.txt
逻辑说明:
NR==1{print; next}:匹配第一行(表头),直接打印后跳过后续判断,不参与列值计算$5 + $7 >= 0.2:对所有非表头行,计算第5列和第7列的和,和值≥0.2时自动打印整行
执行后输出结果和预期完全一致。
内容的提问来源于stack exchange,提问作者Luker354
相关产品推荐
相关产品推荐

