如何结合awk与sub函数正确提取并输出指定多列内容?
解决awk输出格式问题
我来帮你搞定这个awk的问题~你原来的命令之所以没法得到正确结果,是因为用gsub直接修改了$1的值,导致没法输出原始的完整marker字符串啦。
正确的awk命令方案
这里有两种可行的写法,都能得到你想要的输出:
方案1:用split分割提取数字
'{split($1, arr, ":"); print arr[1], $1, 0, $2}' input
- 原理:
split($1, arr, ":")会把第一列按冒号分割成数组arr,arr[1]就是你需要的第一个数字; - 输出顺序:提取的数字 → 原始完整的marker → 固定值0 → 输入里的第二列(POS值)
方案2:用sub修改临时变量
'{marker=$1; sub(/:.*/, "", marker); print marker, $1, 0, $2}' input
- 原理:先把原始的第一列存到临时变量
marker里,再对这个变量执行替换(去掉冒号及后面的内容),这样原始的$1还能保留用来输出;
测试效果
用你提供的输入内容测试,两种命令都会输出:
1 1:244953:TTGAC:T 0 244953 2 2:569406:G:A 0 569406
内容的提问来源于stack exchange,提问作者Pooh
相关产品推荐
相关产品推荐

