awk - 使用printf只格式化一个输出字段?

时间:2016-09-27 17:38:37

标签: linux bash awk printf

一个非常基本的查询,但我无法解决。我是非常基本 awk 用户。

我希望将一个文件(不超过100条记录)带入 awk ,并通过在每行的开头添加一个行号(0填充)来输出修改的文件。

因此,输入文件:

Lorem ipsum dolor sit amet consectetur adipiscing elit
sed do eiusmod tempor incididunt ut labore et

dolore magna aliqua Ut enim ad minim veniam
...

输出文件:

001 Lorem ipsum dolor sit amet consectetur adipiscing elit
002 sed do eiusmod tempor incididunt ut labore et
003
004 dolore magna aliqua Ut enim ad minim veniam
...

我的小编号内线进行行编号(显然)

awk '{print NR, $0}' *infile*

我从中得到

1 Lorem ipsum dolor sit amet consectetur adipiscing elit
2 sed do eiusmod tempor incididunt ut labore et
3
4 dolore magna aliqua Ut enim ad minim veniam
...

请注意,输入文件包含需要保留的空白记录(但输出未编号会更好)

我也知道我可以做到

awk '{printf "%03i", NR}' infile

给我

001
002
003
...

我看不到的是如何将两者结合起来。

我在Linux上使用awk / gawk 4.0.1,所以如果有其他方法可以做我想做的事情,我可以使用其他常用的Linux工具箱。

2 个答案:

答案 0 :(得分:5)

您可以使用printf打印数字,然后打印内容:

awk '{printf "%03i %s\n", NR, $0}' *infile*

03i将打印行号 - NR%s将打印当前行 - $0。其余的是格式化 - 需要在两者和\n之间添加空格,以便在每一行之间换行。

答案 1 :(得分:2)

您可以使用nl from the GNU coreutils为您的行编号:

nl -w 3 -n rz -s ' ' infile
  • -w--number-width)表示要为行号
  • 保留多少列
  • -n--number-format)说明如何格式化数字; rz是"右对齐,领先零"
  • -s--number-separator)是在数字和行本身之间插入的字符串;在这种情况下,一个空格

这默认为跳过空行:

$ nl -w 3 -n rz -s ' ' infile
001 Lorem ipsum dolor sit amet consectetur adipiscing elit
002 sed do eiusmod tempor incididunt ut labore et

003 dolore magna aliqua Ut enim ad minim veniam