Shell脚本编号文件中的行

Dou*_*son 2 shell awk sed

我需要找到一种更快的方法,使用awk和sed等工具以特定方式对文件中的行进行编号.我需要每行的第一个字符以这种方式编号:1,2,3,1,2,3,1,2,3等.

例如,如果输入是这样的:

line 1
line 2
line 3
line 4
line 5
line 6
line 7
Run Code Online (Sandbox Code Playgroud)

输出需要如下所示:

1line 1
2line 2
3line 3
1line 4
2line 5
3line 6
1line 7
Run Code Online (Sandbox Code Playgroud)

这是我所拥有的一大块.$ lines是数据文件中的行数除以3.因此,对于21000行的文件,我处理此循环7000次.

export i=0
while [ $i -le $lines ]
do
    export start=`expr $i \* 3 + 1`
    export end=`expr $start + 2`
    awk NR==$start,NR==$end $1 | awk '{printf("%d%s\n", NR,$0)}' >> data.out
    export i=`expr $i + 1`
done
Run Code Online (Sandbox Code Playgroud)

基本上,它一次抓取3行,对它们进行编号,并添加到输出文件中.它很慢......然后是一些!我不知道另一种,更快,更好的方式......任何想法?

Bil*_*win 14

尝试nl命令.

请参阅https://linux.die.net/man/1/nl(或Google的"man nl"或man nl在shell提示符下运行时出现的文本版本时出现的文档的其他链接).

如果省略file参数,nl实用程序将从命名文件或标准输入中读取行,应用可配置的行编号过滤操作并将结果写入标准输出.

编辑:不,那是错的,我的道歉.该nl命令没有重新启动每n行编号的选项,它只有一个选项,用于在找到模式后重新开始编号.我将这个答案作为社区维基的答案,因为它可能有助于某人了解nl.


Jon*_*son 9

它很慢,因为你一遍又一遍地阅读相同的线条.此外,您正在启动一个awk进程,只关闭它并启动另一个进程.最好一次完成整个事情:

awk '{print ((NR-1)%3)+1 $0}' $1 > data.out
Run Code Online (Sandbox Code Playgroud)

如果您希望在号码后面留一个空格:

awk '{print ((NR-1)%3)+1, $0}' $1 > data.out
Run Code Online (Sandbox Code Playgroud)