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

如何在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

命令细节解释

  1. -v target_id="$id":把shell中定义的id变量传递给Awk内部变量,实现动态指定匹配目标
  2. -F'|':指定names.dmp的字段分隔符为|(NCBI分类学文件的标准分隔规则)
  3. trim()函数:专门处理字段前后的冗余空格,避免原始文件的空格干扰匹配逻辑和输出格式
  4. 精确匹配逻辑:
    • trim($1) == target_id:严格匹配tax-id,彻底排除210090、100904这类包含目标id的无关条目
    • trim($4) == "scientific name":只筛选科学名称类型的条目
  5. 输出处理:将两个字段的空格清理后用|连接,得到干净的目标格式

效果验证

假设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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:26:11