如何实现制表符文件指定列拆分与列位置调整?
解决制表符分隔文件的字段拆分与插入需求
我来帮你搞定这个问题!你想要拆分otherinfo列(第7列),提取指定字段并插入到第2列之后,但之前的awk命令只是替换了分隔符,没有处理字段的筛选和重新排列,所以达不到预期效果。
正确的AWK解决方案
我们需要拆分第7列,提取拆分后的第4、6、7个字段,然后重新排列列的顺序,同时处理表头和数据行:
BEGIN { FS = OFS = "\t" # 统一输入输出的分隔符为制表符 } # 处理表头行 NR == 1 { print $1, $2, "RD", "AD", "Per", $3, $4, $5, $6 next } # 处理数据行 { # 将第7列按冒号拆分到数组arr中 split($7, arr, ":") # 按需求顺序打印列:Chr → Start → RD → AD → Per → End → Ref → Alt → Func. print $1, $2, arr[4], arr[6], arr[7], $3, $4, $5, $6 }
脚本解释
- BEGIN块:设置输入(
FS)和输出(OFS)分隔符为制表符,确保文件处理时的格式一致性。 - 表头处理:第一行插入
RD、AD、Per三个新表头到Start之后,保持其他表头的顺序。 - 数据行处理:
- 使用
split()函数将第7列按冒号:拆分到数组arr中(数组下标从1开始)。 - 提取
arr[4](对应RD)、arr[6](对应AD)、arr[7](对应Per),然后按需求的列顺序打印,丢弃原第7列的其他内容。
- 使用
使用方法
你可以将上述脚本保存为process.awk文件,然后运行:
awk -f process.awk input.txt > output.txt
或者直接使用单行命令:
awk 'BEGIN{FS=OFS="\t"} NR==1{print $1,$2,"RD","AD","Per",$3,$4,$5,$6; next} {split($7,arr,":"); print $1,$2,arr[4],arr[6],arr[7],$3,$4,$5,$6}' input.txt > output.txt
为什么你的原命令不行?
你之前的命令awk 'BEGIN {OFS=FS="\t"} {gsub(/\:/,"\t",$7)}1' input.txt只是将第7列中的冒号替换成制表符,相当于把第7列拆分成多个列,但没有筛选出你需要的第4、6、7个字段,也没有调整列的位置,所以结果会包含大量多余的列,且不符合你想要的列顺序。
内容的提问来源于stack exchange,提问作者RonicK
相关产品推荐
相关产品推荐

