如何用单条awk命令按%ID规则过滤基因表格指定行
单条awk命令实现基因表格过滤
以下是满足需求的单条awk命令,可直接处理你的基因表格:
awk ' BEGIN {OFS="\t"} NR==1 {header=$0; next} $1 ~ /^gene[ABC]$/ { ids[$1] = $2 lines[$1] = $0 next } {other_lines[++n] = $0} END { print header # 找出geneA/B/C中%ID最高的基因 max_val = -1 target = "" for (gene in ids) { if (ids[gene] + 0 > max_val) { max_val = ids[gene] + 0 target = gene } } # 输出保留的目标基因行 if (target != "") print lines[target] # 输出所有非geneA/B/C的行 for (i=1; i<=n; i++) { print other_lines[i] } }' input.txt
命令逻辑说明
- BEGIN块:设置输出字段分隔符为制表符,确保输出表格格式与输入一致
- 表头处理:第一行是表头,单独保存后跳过后续处理
- geneA/B/C收集:匹配到geneA、geneB、geneC的行时,将它们的
%ID值和整行内容分别存入数组,跳过非目标处理 - 其他基因保存:非geneA/B/C的行全部存入另一个数组保留
- END块过滤输出:
- 遍历geneA/B/C的
%ID值,找出数值最大的那个基因 - 先输出表头,再输出保留的目标基因行
- 最后输出所有非geneA/B/C的基因行
- 遍历geneA/B/C的
示例验证
针对你提供的输入表格:
| geneID | %ID |
|---|---|
| geneE | 99 |
| geneA | 95 |
| geneD | 93 |
| geneC | 70 |
| geneB | 89 |
| geneF | 89 |
执行命令后,会筛选出%ID最高的geneA,过滤掉geneB和geneC,最终输出:
| geneID | %ID |
|---|---|
| geneE | 99 |
| geneA | 95 |
| geneD | 93 |
| geneF | 89 |
(注:你提供的期望结果中缺失了geneD,推测是笔误,按照规则geneD不属于geneA/B/C范畴,应当保留)
内容的提问来源于stack exchange,提问作者Sche2021
相关产品推荐
相关产品推荐

