You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:57:17