You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

尝试的命令及问题

  1. 第一次尝试的命令:
{OFS="_"}; {print $1, $2, $3}  {print $2, $3, $4, $5}' test.txt

问题:两次print会导致输出内容分行,且全局设置的OFS="_"会影响第二个print,让后续字段也被下划线分隔。

  1. 第二次尝试的命令:
{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:20:36