当前位置:  开发笔记 > 编程语言 > 正文

Shell脚本编号文件中的行

如何解决《Shell脚本编号文件中的行》经验,为你挑选了2个好方法。

我需要找到一种更快的方法,使用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

输出需要如下所示:

1line 1
2line 2
3line 3
1line 4
2line 5
3line 6
1line 7

这是我所拥有的一大块.$ 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

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



1> Bill Karwin..:

尝试nl命令.

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

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

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



2> Jon Ericson..:

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

awk '{print ((NR-1)%3)+1 $0}' $1 > data.out

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

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

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有