使用awk打印从零开始的行号

77

请问如何使用awk打印包括0在内的行号?

这是我的输入文件stackfile2.txt

当我运行下面的awk命令时,我得到的结果为actual_output.txt

awk '{print NR,$0}' stackfile2.txt | tr " ", "," > actual_output.txt

我的期望输出是file.txt

如何打印以零(0)开头的行号?


2
这不是 awk '{print NR-1,$0}' 吗? - Anton Kovalenko
3
@user790049,不要让我们追踪链接来了解问题所在。请提供一个小的输入示例,并告诉我们您想要输出的样式是什么。http://stackoverflow.com/help/how-to-ask - glenn jackman
抱歉,下次我会注意的。 - user790049
2
文件的链接已经失效了。你能否[编辑]问题并包含一些适当的[mcve]? - fedorqui
4个回答

125

NR从1开始,因此请使用

awk '{print NR-1 "," $0}'

6
将输出字段分隔符设置为逗号可能更好:awk -v OFS="," '{print NR-1, $0}' file - fedorqui
1
如果您正在寻找自定义起始值和其他自定义选项,请查看下面基于“nl”的答案。 - malana

18

使用awk。

i从0开始,i++将增加i的值,但返回被增加之前i的原始值。

awk '{print i++ "," $0}' file

1
  • 对于比 NR-1 短一个字符的情况,您也可以使用 awk '{print i++,$0}' OFS=, file,但这会更长。
- Jotne
5
在打高尔夫球时,awk '$0=i++","$0' 厉害极了 ;-) (注:原文为英语幽默口语,意思是在打高尔夫球时,这条命令可以给每个杆数前面加上序号并输出,表示对该命令的赞赏) - Adrian Frühwirth

12

除了awk之外,另一个选项是nl,它允许使用-v选项设置起始值和-n<lf,rf,rz>选项进行左对齐、右对齐和右对齐并使用前导零进行对齐。您还可以包括-s用于字段分隔符,例如-s ","表示行号和数据之间使用逗号分隔。

在Unix环境中,可以这样做:

cat <infile> | ...other stuff... | nl -v 0 -n rz

或者仅仅是

nl -v 0 -n rz <infile>

例子:

echo "Here 
are
some 
words" > words.txt

cat words.txt | nl -v 0 -n rz

输出:

000000      Here
000001      are
000002      some
000003      words

2
如果您可以使用Perl,您可以尝试以下方法:
perl -ne 'printf "%s,$_" , $.-1' file

$_ 是当前行的内容
$. 是当前行号


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