如何在Awk中使用变量精确匹配tax-id获取对应科学名称
解决names.dmp动态精确匹配tax-id并格式化输出的问题
最优命令方案(一步完成,无需多管道)
直接用Awk一次性完成过滤、精确匹配和格式调整,省去cat/grep/cut这类多余的管道操作:
# 先设置目标tax-id变量 id=10090 # 执行Awk命令处理names.dmp awk -v target_id="$id" -F'|' ' # 定义trim函数:去除字符串前后的空白字符 function trim(str) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", str) return str } # 匹配条件:1. 去除空格后的tax-id完全等于目标id;2. 名称类型是"scientific name" trim($1) == target_id && trim($4) == "scientific name" { # 格式化输出:去除两个字段的空格后用" | "连接 print trim($1) " | " trim($2) } ' names.dmp
命令细节解释
-v target_id="$id":把shell中定义的id变量传递给Awk内部变量,实现动态指定匹配目标-F'|':指定names.dmp的字段分隔符为|(NCBI分类学文件的标准分隔规则)trim()函数:专门处理字段前后的冗余空格,避免原始文件的空格干扰匹配逻辑和输出格式- 精确匹配逻辑:
trim($1) == target_id:严格匹配tax-id,彻底排除210090、100904这类包含目标id的无关条目trim($4) == "scientific name":只筛选科学名称类型的条目
- 输出处理:将两个字段的空格清理后用
|连接,得到干净的目标格式
效果验证
假设names.dmp中有以下输入行:
10090 | Mus musculus | | scientific name | 210090 | Example Species | | scientific name | 100904 | Another Species | | scientific name |
执行命令后会输出:
10090 | Mus musculus
简化版(不定义函数)
如果觉得函数写法繁琐,也可以用正则直接处理空格,效果一致:
id=10090 awk -v id="$id" -F'|' '$4 ~ /scientific name/ && $1 ~ /^[[:space:]]*'$id'[[:space:]]*$/ { gsub(/[[:space:]]+/, " ", $1 " | " $2) print }' names.dmp
内容的提问来源于stack exchange,提问作者chan-98
相关产品推荐
相关产品推荐

