Shell脚本编号文件中的行

时间:2008-12-08 20:05:48

标签: shell sed awk

我需要找到一种更快的方法,使用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行,对它们进行编号,然后添加到输出文件中。它很慢......然后是一些!我不知道另一种,更快的方式来做这个......有什么想法吗?

9 个答案:

答案 0 :(得分:13)

尝试nl命令。

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

  

nl实用程序从中读取行   命名文件或标准输入if   文件参数被省略,适用   可配置的行号过滤器   操作并将结果写入   标准输出。

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

答案 1 :(得分:9)

这很慢,因为你一遍又一遍地阅读相同的行。此外,您正在启动awk进程,仅将其关闭并启动另一个进程。最好一次完成整个事情:

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

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

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

答案 2 :(得分:2)

Perl浮现在脑海中:

perl -pe '$_ = (($.-1)%3)+1 . $_'

应该有效。毫无疑问,有一个awk等价物。基本上,((line# - 1) MOD 3) + 1

答案 3 :(得分:2)

这可能对您有用:

 sed 's/^/1/;n;s/^/2/;n;s/^/3/' input

答案 4 :(得分:1)

awk '{printf "%d%s\n", ((NR-1) % 3) + 1, $0;}' "$@"

答案 5 :(得分:1)

的Python

import sys
for count, line in enumerate(sys.stdin):
    stdout.write( "%d%s" % ( 1+(count % 3), line )

答案 6 :(得分:1)

你不需要为此留下bash:

i=0; while read; do echo "$((i++ % 3 + 1)) $REPLY"; done < input

答案 7 :(得分:0)

这应该可以解决问题。 $ _将打印整行。

awk '{print ((NR-1)%3+1) $_}' < input
1line 1
2line 2
3line 3
1line 4
2line 5
3line 6
1line 7

# cat input 
  line 1
  line 2
  line 3
  line 4
  line 5
  line 6
  line 7

答案 8 :(得分:0)

另一种方法是只使用grep并匹配所有内容。例如,这将枚举文件:

grep -n '.*' <<< `ls -1`

输出将是:

1:file.a
2:file.b
3:file.c