如何用awk为同一表格设置两种不同的字段分隔符?
用Awk调整表格输出格式
需求
原始表格(共100行,前2行示例):
25 Mike Robin 115 DDA 37 Tom Murray 98 SSM
需要转换成如下格式:
25_Mike_Robin Mike Robin 115 DDA 37_Tom_Murray Tom Murray 98 SSM
尝试的命令及问题
- 第一次尝试的命令:
{OFS="_"}; {print $1, $2, $3} {print $2, $3, $4, $5}' test.txt
问题:两次print会导致输出内容分行,且全局设置的OFS="_"会影响第二个print,让后续字段也被下划线分隔。
- 第二次尝试的命令:
{OFS="_"}; {print $1, $2, $3}; {OFS="\t"; {print $2, $3, $4,$5}' test.vcf
问题:语法错误(括号不匹配,多了一个左大括号),且即使修正括号,两次print仍会导致内容分行。
正确的解决方案
方法1:直接用printf拼接输出
最直观的手动控制格式方式:
awk '{printf "%s_%s_%s %s %s %s %s\n", $1, $2, $3, $2, $3, $4, $5}' test.txt
思路:先按_拼接前三个字段作为前缀,再用空格分隔输出后续所有字段。
方法2:保留原后续字段的分隔符
如果原数据中后续字段的分隔符不固定(比如存在多个空格),可以用字符串截取保留原始格式:
awk '{prefix = $1 "_" $2 "_" $3; print prefix " " substr($0, index($0, $2))}' test.txt
思路:先拼接前缀,再从原行中截取从第二个字段开始的内容,和前缀拼接后输出。
方法3:用OFS临时处理前缀
如果需要用OFS统一控制前缀的分隔符,可以在同一个print操作中完成:
awk '{OFS="_"; prefix = $1 OFS $2 OFS $3; OFS=" "; print prefix, $2, $3, $4, $5}' test.txt
思路:先设置OFS="_"生成前缀,再将OFS改回空格,把前缀和后续字段一次性输出(避免分行)。
内容的提问来源于stack exchange,提问作者Dr. Heinz Doofenshmirtz PhD
相关产品推荐
相关产品推荐

