如何用awk同时以逗号和冒号拆分列(禁用awk -F)
解决awk同时用逗号和冒号拆分列的问题
你可以在awk的split()函数里使用正则表达式作为分隔符,这样就能同时匹配冒号和逗号了。因为split()的第三个参数支持正则规则,指定/[:,]/就能把这两个字符都当作分隔符来处理。
针对你的需求,修改后的命令可以这样写:
echo "0/1:121,313:4:99:123,0,104" | awk '{split($0,a,/[:,]/); print a[2] a[3]}'
执行这条命令后,就能得到你想要的输出:121313。
为什么这个方法有效?
split($0,a,/[:,]/)会把整个输入行按照冒号或者逗号拆分,把每一段内容存到数组a里。原来的121,313会被拆成a[2]=121和a[3]=313,而不是之前未处理逗号时的a[2]=121,313。- 直接拼接
a[2]和a[3]就得到了目标输出。
针对大型制表符分隔文件的适配
因为你是处理大型制表符分隔文件的一部分,这个方法完全适用——split()函数处理单条记录的效率很高,不会比-F选项慢多少,而且能灵活嵌入到你现有的awk脚本逻辑里,不会影响其他字段的处理。
比如如果你原本的脚本是处理每行的其他制表符分隔字段,现在可以直接把这个拆分逻辑加进去:
# 假设大文件每行是制表符分隔,这里单独处理第3列的冒号/逗号拆分 awk -F"\t" '{split($3,a,/[:,]/); print $1, $2, a[2]a[3], $4}' your_large_file.txt
这样就能在不改变整体字段分隔符设置的前提下,单独处理目标列的拆分需求。
内容的提问来源于stack exchange,提问作者RonicK
相关产品推荐
相关产品推荐

