如何用awk过滤测序计数文件中样本列总和不足100的行?
使用AWK过滤计数文件:保留样本列总和≥100的行
没问题,这就给你一个简单直接的awk解决方案,完美适配你的需求:
核心命令
awk 'NR==1 {print; next} {sum=0; for(i=3;i<=10;i++) sum+=$i; if(sum>=100) print}' input.txt > filtered_output.txt
命令详解
让我拆解一下每个部分的作用,帮你理解逻辑:
NR==1 {print; next}:处理文件的第一行(表头行),直接打印输出,然后用next跳过后续计算逻辑——毕竟表头不需要统计总和。sum=0:初始化总和变量,确保每一行的计算都是从0开始累加。for(i=3;i<=10;i++) sum+=$i:遍历第3到第10列(对应你的S1到S8样本列),把每一列的数值加到sum里,计算当前行的样本总计数。if(sum>=100) print:如果当前行的样本总计数≥100,就打印输出这一行;否则自动跳过。
通用化调整(可选)
如果你的样本列数量以后可能变化(比如新增S9、S10),可以把列数范围改成动态匹配当前行的所有列(从第3列开始到最后一列),这样命令更灵活:
awk 'NR==1 {print; next} {sum=0; for(i=3;i<=NF;i++) sum+=$i; if(sum>=100) print}' input.txt > filtered_output.txt
这里的NF是awk的内置变量,表示当前行的总列数,这样不管后面加多少样本列,命令都能自动适配。
效果验证
拿你给出的示例数据来说:
第一行数据列总和:0+1+1+8+1+0+1+5=17 → 低于100,会被过滤
第二行数据列总和:50+1+5+0+2+0+4+0=62 → 低于100,会被过滤
倒数第二行总和:0+0+5+7+5+47+2+2=68 → 低于100,会被过滤
最后一行总和:5+4+1+0+7+0+1+1=19 → 低于100,会被过滤
只有那些样本列总和≥100的行会被保留到filtered_output.txt中。
内容的提问来源于stack exchange,提问作者Aquilifer
相关产品推荐
相关产品推荐

