我需要找到一种更快的方法,使用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行,对它们进行编号,并添加到输出文件中.它很慢......然后是一些!我不知道另一种,更快,更好的方式......任何想法?
尝试nl
命令.
请参阅https://linux.die.net/man/1/nl(或Google的"man nl"或man nl
在shell提示符下运行时出现的文本版本时出现的文档的其他链接).
如果省略file参数,nl实用程序将从命名文件或标准输入中读取行,应用可配置的行编号过滤操作并将结果写入标准输出.
编辑:不,那是错的,我的道歉.该nl
命令没有重新启动每n
行编号的选项,它只有一个选项,用于在找到模式后重新开始编号.我将这个答案作为社区维基的答案,因为它可能有助于某人了解nl
.
它很慢,因为你一遍又一遍地阅读相同的线条.此外,您正在启动一个awk
进程,只关闭它并启动另一个进程.最好一次完成整个事情:
awk '{print ((NR-1)%3)+1 $0}' $1 > data.out
如果您希望在号码后面留一个空格:
awk '{print ((NR-1)%3)+1, $0}' $1 > data.out