在文件的每一行开头添加数字

64

如何在文件的每一行开头添加数字?

例如:

This is
the text
from the file.

变成:

000000001 This is
000000002 the text
000000003 from the file.
7个回答

124

不要使用cat或任何其他不适合此用途的工具。请使用该程序:

nl - 给文件加上行号

示例:

$ nl --number-format=rz --number-width=9 foobar
$ nl -n rz -w 9 foobar # short-hand

因为nl专为此而设计;-)


7
ls | nl #nl for dummies 翻译为:使用ls命令列出文件并通过管道符号|将结果传递给nl命令,最后使用#nl for dummies作为注释。 - Aaron Blenkush
nl并不能在所有情况下都有所帮助。请参见以下内容:$ cat test123 123sd$ nl test123 1 123 2 sd$ awk '{print NR,$0}' test123 1 123 2 3 sd - egorulz
2
直到读取EOF,它才会输出行。因此,您无法将其用于在线编号长时间运行的程序的输出。 - arekolek
2
@egorulz 使用 -ba 开关。 - Hynek -Pichi- Vychodil

39

AWK的printfNR$0使得对格式具有精确和灵活控制变得容易:

~ $ awk '{printf("%010d %s\n", NR, $0)}' example.txt
0000000001 This is
0000000002 the text
0000000003 from the file.

太棒了!我需要这个来填充一个巨大的静态int声明数组,所以我有类似于public static final int CONSTANTX;的东西,我想要类似于public static final int CONSTANTX;=X的东西,其中X是源文件中的行号。我将您的答案重新排列为awk '{printf("%s = %d;\n", $0, NR-4)}' Constants.java,它像魔法一样奏效! - afe

32

你正在寻找 nl(1) 命令:

$ nl -nrz -w9  /etc/passwd
000000001   root:x:0:0:root:/root:/bin/bash
000000002   daemon:x:1:1:daemon:/usr/sbin:/bin/sh
000000003   bin:x:2:2:bin:/bin:/bin/sh
...

-w9 要求数字为9位数;-nrz 要求将数字格式化为右对齐且用零填充。


这是一个准确且不错的答案,但对于作业风格的问题,提供提示、链接或更通用的解决方案可能会更好。 - Raymond Hettinger
3
@Raymond,确实如此,但我没有看到任何迹象表明这是作业。简单?当然。但即使是经验丰富的开发人员也不会了解这些东西中的大量文本处理工具。 - sarnold
@Raymond:我建议你恢复你的答案,我很喜欢它。不同的工具可能因为不同的原因而表现出色,而awk(1)在这样的任务上确实表现出色。 - sarnold
我之所以知道是因为几分钟前我偶然看到了一个类似的问题:https://dev59.com/q2sy5IYBdhLWcg3w9Srk。此外,示例中不寻常的前导零也是另一个提示 :-) - Raymond Hettinger
1
这不是为了作业。我只是想,用awk和一些循环可能需要2个小时才能弄清楚如何做到这一点,而脚本运行文件还需要另外30分钟;或者我可以在这里问问。我以前从未听说过nl。我发错了问题吗? - Village
4
村庄:不是这样的—— Stack Overflow 旨在回答各个级别的问题。@Raymond 刚刚注意到你在短时间内提出了三个问题,要求解决类似于“学习 Unix”课程中教授可能分配的作业的问题解决方案。 单独一个问题听起来像是有人在寻找解决问题的方法,但是把所有三个问题放在一起,就让我们怀疑我们是否替你完成作业。 :) - sarnold

17

cat -n thefile 会完成任务,虽然数字格式略有不同。


8
最简单、最简单的选择是:
awk '{print NR,$0}' file

参见上述评论,说明nl并不是最佳选项。


6
这里有一个Bash脚本也可以实现这个功能:
#!/bin/bash
counter=0
filename=$1
while read -r line
do
  printf "%010d %s" $counter $line
  let counter=$counter+1
done < "$filename"

4
perl -pe 'printf "%09u ", $.' -- example.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接