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

如何用Awk为匹配模式的行添加补零递增序号

问题:给三位数字开头的行添加补零递增序号

需要给所有以3位数字开头的文本行,在开头3位数字后追加.XXX格式的3位补零递增序号(例如227变为227.001),文本中可能包含空行或非目标行。现有Awk命令可实现递增但无法补零,尝试用printf("%03d", ++i)替换递增变量未成功,求正确实现方法。

输入示例

227| Mathematics | 9 | search,seo |
038| Top Games | 2391 | search,seo,cookies |
136| Top Programming Languages | 219 | cookies |

期望输出

227.001| Mathematics | 9 | search,seo |
038.002| Top Games | 2391 | search,seo,cookies |
136.003| Top Programming Languages | 219 | cookies |

当前使用的命令

echo -e "Last Updated: Mar 15 2023

- Score: cumulative of benchmarking tools.
- KiB: total size of the page.
- Stats: metrics related to the page.

| Score | KiB | Stats |
| --- | --- | --- |
227| Mathematics | 9 | search,seo |
038| Top Games | 2391 | search,seo,cookies |
136| Top Programming Languages | 219 | cookies |" | awk '/^[0-9]{3}/{$0 = substr($0,1,3) "." ++i substr($0,4)} 1'

解决方案

问题出在printf是输出函数,不能直接用来拼接字符串。要生成格式化的补零序号,需要用sprintf函数(它会返回格式化后的字符串,而非直接输出)。

修正后的命令:

echo -e "Last Updated: Mar 15 2023

- Score: cumulative of benchmarking tools.
- KiB: total size of the page.
- Stats: metrics related to the page.

| Score | KiB | Stats |
| --- | --- | --- |
227| Mathematics | 9 | search,seo |
038| Top Games | 2391 | search,seo,cookies |
136| Top Programming Languages | 219 | cookies |" | awk '/^[0-9]{3}/{$0 = substr($0,1,3) sprintf(".%03d", ++i) substr($0,4)} 1'

关键说明

  • /^[0-9]{3}/:精准匹配以三位数字开头的行
  • sprintf(".%03d", ++i):生成.XXX格式的补零序号,%03d确保数字始终为三位,不足时自动补前导零
  • substr($0,1,3) + 格式化序号 + substr($0,4):拼接成新的行内容
  • 末尾的1:Awk的默认动作,打印所有行(包括非目标行、空行,保证原文本结构不变)

内容的提问来源于stack exchange,提问作者Jieiku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:13:12