Awk技术问询:如何打印含gene=的列及其前一列(带eC_number)
解决方案
这里给你调整后的Awk代码,既满足提取gene=字段的需求,又能同时输出它的前一列,而且只会处理包含gene=的行:
awk -F ' |;' '{ # 初始化变量,避免残留上一行的内容 found = 0 prev_col = "" gene_col = "" # 从第9列开始遍历字段(和你原逻辑一致) for(i=9; i<=NF; i++){ # 找到第一个以gene=开头的字段 if($i ~ /^gene=/){ prev_col = $(i-1) # 记录前一列内容 gene_col = $i # 记录当前gene字段 found = 1 # 标记该行有符合条件的字段 break # 找到第一个就跳出循环,要最后一个的话去掉这行 } } # 只有找到gene=字段的行才输出结果 if(found){ print prev_col, gene_col } }' file
关键细节说明:
- 字段分隔符:保持你原来的
\t(制表符)和;,确保能正确拆分目标文件里的字段格式 - 第一个/最后一个匹配:代码里加了
break,会取第一个出现的gene=字段;如果你的需求是取最后一个匹配的,删掉break即可 - 过滤无gene=的行:通过
found标志位,确保只有包含gene=的行才会输出,避免空行或无效内容 - EC_number适配:不管前一列是不是
EC_number,代码都会输出它;如果你只想保留前一列是EC_number的情况,可以把判断条件改成:if($i ~ /^gene=/ && $(i-1) ~ /^EC_number=/)
你可以先用目标文件的小样本测试下,看看输出是否符合预期~
内容的提问来源于stack exchange,提问作者crazysantaclaus
相关产品推荐
相关产品推荐

