我可以使用NR功能加速AWK程序

时间:2014-01-09 21:39:58

标签: awk

我正在使用awk从我们+ 30M记录的文件中提取数据。我知道在几千条记录中我想要的记录是什么。我很好奇我是否可以通过告诉它设置NR的起点来减少找到记录的时间。例如,我的记录是> 2500万行,我可以使用以下内容:

awk 'BEGIN{NR=25000000}{rest of my script}' in

这会让awk直接跳到25M记录并节省我在此之前扫描每条记录的时间吗?

更好的例子,我在sh中循环使用这个AWK。我需要awk脚本的正常输出,但我还希望它在完成下一次交互时传递给NR,当循环再次返回到此脚本时。

awk -v n=$line -v r=$record 'BEGIN{a=1}$4==n{print $10;a=2}($4!=n&&a==2){(pass NR out to $record);exit}' in

3 个答案:

答案 0 :(得分:4)

不。我们来试试吧:

$ cat -n file
     1  one
     2  two
     3  three
     4  four
$ awk 'BEGIN {NR=2} {print NR, $0}' file
3 one
4 two
5 three
6 four

您的记录是固定长度的,还是您知道平均线长?如果是,那么您可以使用允许您打开文件并寻找位置的语言。否则你必须阅读所有这些行:

awk -v start=25000000 'NR < start {next} {your program here}' file

为了保持你在脚本运行之间的位置,我会使用像perl这样的语言:在运行结束时使用tell()输出当前位置,比如输出文件;然后在下一次运行开始时,使用seek()选择你离开的地方。如果文件被截断,请检查起始位置是否小于当前文件大小。

答案 1 :(得分:0)

记录通常没有固定的大小,因此awk无法扫描文件的第一部分,甚至只是为了跳过它们。

如果您想跳过输入文件的第一部分并且(大致)知道要忽略的大小,可以使用dd截断输入,例如,假设记录宽度为80字节:< / p>

dd if=inputfile bs=25MB skip=80 | awk ... 

最后,当您点击感兴趣区域的末尾时,您可以通过退出awk脚本来避免awk扫描最后的记录。

答案 2 :(得分:0)

单向(使用sed),如果你知道行号

for n in 3 5 8 9  .... 
do
  sed -n "${n}p" file |awk command
done

sed -n "25000,30000p" file |awk command