如何用awk分割文本文件中第6个冒号分隔的列?
使用AWK拆分指定列的冒号分隔内容
没问题,用AWK可以轻松实现这个需求,我给你详细说明怎么做:
首先明确你的输入和期望输出:
输入行
chr1 15431658 A T GT:AD:DP:GQ:PL 0/1:15,20:35:66:211,0,222
期望输出行
chr1 15431658 A T GT:AD:DP:GQ:PL 0/1 15,20 35 66 211,0,222
实现命令
你可以用下面这个AWK命令来处理:
awk '{ # 把第6列按冒号拆分到数组a中,n是拆分后的元素总数 n = split($6, a, ":") # 将原第6列替换为拆分后的第一个元素(0/1) $6 = a[1] # 把剩下的拆分元素逐个追加为新字段 for (i=2; i<=n; i++) { $(NF + 1) = a[i] } } 1' input.txt
命令细节解释
split($6, a, ":"):将第6列的内容按冒号:分割,每个部分存入数组a,变量n记录拆分后的元素数量(这里是5个)。$6 = a[1]:把原来的第6列替换成数组的第一个元素0/1。for (i=2; i<=n; i++) $(NF + 1) = a[i]:NF是当前行的字段总数,从数组第2个元素开始,依次把15,20、35等赋值给新的字段(NF+1、NF+2...),AWK会自动用默认的空格分隔所有字段。- 最后的
1是AWK的惯用简写,代表执行默认的打印操作(输出处理后的整行)。
测试效果
把你给出的输入行放到input.txt里执行命令,输出完全符合你的需求。如果要处理整个文件,直接替换input.txt为你的文件名即可;如果是从管道读取内容(比如配合其他命令),可以写成:
cat your_file.txt | awk '{n = split($6, a, ":"); $6 = a[1]; for(i=2; i<=n; i++) $(NF+1)=a[i]} 1'
内容的提问来源于stack exchange,提问作者lananhle
相关产品推荐
相关产品推荐

