如何用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
相关产品推荐
相关产品推荐

