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

如何用Bash命令重命名变异列并提取rsID?

问题

我有一个大型文件,其第二字段包含rsID。部分变异的格式为chr1-97981343:rs55886062-AT,需要用Bash命令将这类标识符替换为仅显示rsID(如rs55886062)。

示例输入数据:

1   rs3918290   110 97915614    A   G
1   chr1-97981343:rs55886062-AT 110 97981343    A   T
1   rs72549303  110 97915622    C   A
1   rs17376848  110 97915624    G   A
1   rs59086055  110 97915746    A   G

期望输出:

1   rs3918290   110 97915614    A   G
1   rs55886062  110 97981343    A   T
1   rs72549303  110 97915622    C   A
1   rs17376848  110 97915624    G   A
1   rs59086055  110 97915746    A   G

解决方案

方法1:用awk处理

awk适合结构化文本处理,可精准匹配提取rsID:

awk '{ if ($2 ~ /rs[0-9]+/) { match($2, /rs[0-9]+/); $2 = substr($2, RSTART, RLENGTH) } }1' input.txt > output.txt
  • $2 ~ /rs[0-9]+/:判断第二字段是否包含rsID格式内容
  • match(...):定位第二字段中rs开头加数字的片段,RSTART是匹配起始位置,RLENGTH是匹配长度
  • substr(...):将第二字段替换为提取到的rsID
  • }1:打印所有行(包括未修改的行)

方法2:用sed处理

sed适合行级文本替换,通过正则捕获组提取目标内容:

sed -E 's/^([^[:space:]]+[[:space:]]+)chr[^:]+:(rs[0-9]+)-[^[:space:]]+/\1\2/' input.txt > output.txt
  • ^([^[:space:]]+[[:space:]]+):捕获第一字段及后续空白部分
  • chr[^:]+:(rs[0-9]+)-[^[:space:]]+:匹配chr...:rsXXX-...格式的第二字段,捕获其中的rsXXX片段
  • \1\2:用第一捕获组(第一字段+空白)和第二捕获组(rsID)替换原内容
  • -E:启用扩展正则,减少转义符使用

若需直接修改原文件(谨慎操作),可添加-i参数:

sed -i -E 's/^([^[:space:]]+[[:space:]]+)chr[^:]+:(rs[0-9]+)-[^[:space:]]+/\1\2/' input.txt

内容的提问来源于stack exchange,提问作者Svalf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:05:52