如何用awk批量拆分多列数据?寻求替代逐列拆分的优化方案
更简洁的多列批量处理方案
嘿,针对你这种有大量类似格式列需要拆分的场景,完全不用逐列手动split,可以用一个循环批量处理所有字段,代码简洁还能适配任意数量的目标列!
这里是优化后的awk命令:
awk '{ # 先输出第一列,不换行 printf "%s", $1 # 遍历从第2列开始的所有字段 for (i=2; i<=NF; i++) { # 用冒号和竖线作为分隔符拆分当前字段 split($i, parts, /[:|]/) # 输出我们需要的第3段和第5段,用制表符分隔 printf "\t%s\t%s", parts[3], parts[5] } # 每一行处理完后换行 print "" }' in.file
命令逻辑说明:
NF是awk内置变量,代表当前行的总字段数,循环i=2; i<=NF就能覆盖所有需要拆分的列,不管列数多少都不用改代码- 拆分分隔符用
/[:|]/,一次性处理每个字段里的:和|,拆分后parts数组里的元素对应:parts[1]→q1/q2这类前缀parts[2]→ 第一个Ovary编号(比如Ovary1.13)parts[3]→ 你需要的带后缀的编号(比如Ovary1.13.1)parts[4]→ 中间的数值(比如100)parts[5]→ 最后需要保留的数值(比如32.599877)
- 用
printf控制输出格式,确保每列用制表符分隔,和你原来的输出格式一致
用你提供的测试输入运行这个命令,就能得到完全符合期望的输出啦!
内容的提问来源于stack exchange,提问作者Corend
相关产品推荐
相关产品推荐

