我正在使用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
答案 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