技术求助:如何用awk将数据格式化为指定样式?现有代码未生效
格式化四列数据为指定样式
原始数据:
26.77 12.477 -25 100 26.364 12.476 -20 100 26.372 11.47 -16 100 26.366 10.473 -10 100 26.158 10.472 -9 100 26.75 12.471 2 100
期望格式:
26.770 12.477 -25 100 26.364 12.476 -20 100 26.372 11.470 -16 100 26.366 10.473 -10 100 26.158 10.472 -09 100 26.750 12.471 02 100
你之前使用%.3g的问题在于,%.3g是保留三位有效数字,会自动省略末尾的0,而非强制保留三位小数;同时第三列的正负对齐补0逻辑也未处理到位。
正确的awk实现方案
awk '{ # 处理第三列:负数格式化为-XX,正数格式化为 XX(前加空格,数字补0到两位) if ($3 < 0) { col3 = sprintf("-%02d", -$3) } else { col3 = sprintf(" %02d", $3) } # 前两列强制保留三位小数,按格式输出所有列 printf("%.3f %.3f %s %d\n", $1, $2, col3, $4) }' in.dat
也可以写成一行精简版:
awk '{ printf("%.3f %.3f %s %d\n", $1, $2, ($3<0?sprintf("-%02d",- $3):sprintf(" %02d",$3)), $4) }' in.dat
格式说明
%.3f:强制保留三位小数,不足时末尾补0,完美匹配前两列的格式要求;- 第三列通过条件判断处理:
- 负数时取绝对值,用
%02d补0到两位后加上负号; - 非负数时用
%02d补0到两位,前面加空格保证和负数列对齐;
- 负数时取绝对值,用
%d:第四列直接按整数格式输出即可。
内容的提问来源于stack exchange,提问作者user19520518
相关产品推荐
相关产品推荐

