Shell 脚本对文件中的行进行编号
我需要找到一种更快的方法,使用 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 行,对它们进行编号,然后添加到输出文件中。 速度很慢...还有一些! 我不知道还有另一种更快的方法来做到这一点......有什么想法吗?
I need to find a faster way to number lines in a file in a specific way using tools like awk and sed. I need the first character on each line to be numbered in this fashion: 1,2,3,1,2,3,1,2,3 etc.
For example, if the input was this:
line 1
line 2
line 3
line 4
line 5
line 6
line 7
The output needs to look like this:
1line 1
2line 2
3line 3
1line 4
2line 5
3line 6
1line 7
Here is a chunk of what I have. $lines is the number of lines in the data file divided by 3. So for a file of 21000 lines I process this loop 7000 times.
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
Basically this grabs 3 lines at a time, numbers them, and adds to an output file. It's slow...and then some! I don't know of another, faster, way to do this...any thoughts?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
尝试使用 nl 命令。
请参阅 https://linux.die.net/man/1/nl (或其他链接到当您 Google 搜索“man nl”时出现的文档或在 shell 提示符下运行
man nl
时出现的文本版本)。编辑:不,这是错误的,我很抱歉。
nl
命令没有每n
行重新开始编号的选项,它只有在找到模式后重新开始编号的选项。 我会将这个答案作为社区 wiki 答案,因为它可能会帮助某人了解nl
。Try the
nl
command.See https://linux.die.net/man/1/nl (or another link to the documentation that comes up when you Google for "man nl" or the text version that comes up when you run
man nl
at a shell prompt).edit: No, that's wrong, my apologies. The
nl
command doesn't have an option for restarting the numbering everyn
lines, it only has an option for restarting the numbering after it finds a pattern. I'll make this answer a community wiki answer because it might help someone to know aboutnl
.它很慢,因为你一遍又一遍地阅读相同的行。 此外,您启动一个
awk
进程只是为了将其关闭并启动另一个进程。 最好一次完成整个事情:如果您希望在数字后面有一个空格:
It's slow because you are reading the same lines over and over. Also, you are starting up an
awk
process only to shut it down and start another one. Better to do the whole thing in one shot:If you prefer to have a space after the number:
我想到了 Perl:
应该可以。 毫无疑问,有一个 awk 等效项。 基本上,
((line# - 1) MOD 3) + 1
。Perl comes to mind:
should work. No doubt there is an awk equivalent. Basically,
((line# - 1) MOD 3) + 1
.这可能对你有用:
This might work for you:
另一种方法是使用 grep 并匹配所有内容。 例如,这将枚举文件:
输出将是:
Another way is just to use grep and match everything. For example this will enumerate files:
Output will be:
Python
Python
你不需要为此离开 bash:
You don't need to leave bash for this:
这应该可以解决问题。 $_ 将打印整行。
This should solve the problem. $_ will print the whole line.