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