如何用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
相关产品推荐
相关产品推荐

