Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在大文件中使用sed或awk打印行后的时间延迟_Bash_Shell_Awk_Sed_Timedelay - Fatal编程技术网

Bash 在大文件中使用sed或awk打印行后的时间延迟

Bash 在大文件中使用sed或awk打印行后的时间延迟,bash,shell,awk,sed,timedelay,Bash,Shell,Awk,Sed,Timedelay,我有一个大文件(1Gb),我需要使用记录编号提取其中的几行。我用sed写了我的脚本,因为它花费了太多的时间,我决定调查它。 结果是,当我运行类似 sed-n'1568915696p'文件名 打印速度很快,但之后我有一个时间延迟,这使我的脚本变得非常慢。使用awk执行相同的任务延迟更小,但仍然存在!我用于awk的命令行是: awk'NR>=15689&&NR这是因为它扫描到文件的末尾。请在打印后尝试退出: sed -ne '15690q;15689p' file 或使用awk: awk 'NR&

我有一个大文件(1Gb),我需要使用记录编号提取其中的几行。我用sed写了我的脚本,因为它花费了太多的时间,我决定调查它。 结果是,当我运行类似 sed-n'1568915696p'文件名 打印速度很快,但之后我有一个时间延迟,这使我的脚本变得非常慢。使用awk执行相同的任务延迟更小,但仍然存在!我用于awk的命令行是:
awk'NR>=15689&&NR这是因为它扫描到文件的末尾。请在打印后尝试退出:

sed -ne '15690q;15689p' file
或使用awk:

awk 'NR>=15689 && NR<=15696{print} NR==15697{exit}' filename
awk'NR>=15689&&NR文件
时间(head-50000000文件| tail-10)>/dev/null
时间(sed-n'50000000q;4999915000000p'文件)>/dev/null

时间(awk'NR>=4999991&&NR=4999991&&NR避免使用
sed-n'15689156p'
,因为sed将遍历整个文件。我知道的最快方法是:

head -15696 filename | tail -10
我对它进行了基准测试,它运行得更快:

$ seq 1 100000000 > file

$ time (head -50000000 file | tail -10) > /dev/null
real    0m0.694s
user    0m0.830s
sys     0m0.333s

$ time (sed -n '49999991,50000000p' file) > /dev/null
real    0m6.018s
user    0m5.863s
sys     0m0.160s

$ time (sed -n '50000000q;49999991,50000000p' file) > /dev/null
real    0m3.197s
user    0m3.153s
sys     0m0.043s

$ time (awk 'NR>=49999991 && NR<=50000000' file) > /dev/null
real    0m12.665s
user    0m12.543s
sys     0m0.123s

$ time (awk 'NR>=49999991 && NR<=50000000{print} NR==50000001{exit}' file)
real    0m9.104s
user    0m9.010s
sys     0m0.100s
$seq 1 100000000>文件
$time(head-50000000文件| tail-10)>/dev/null
实际0.694s
用户0.830s
sys 0m0.333s
$time(sed-n'4999915000000p'文件)>/dev/null
实0m6.018s
用户0m5.863s
sys 0m0.160s
$time(sed-n'50000000q;4999915000000p'文件)>/dev/null
实际0m3.197s
用户0m3.153s
系统0m0.043s

$time(awk'NR>=4999991&&NR=49999991&&NR如果在打印所需行后告诉
awk
退出该行是否有帮助?
awk
(和
sed
)除非你告诉他们完成/退出,否则我不知道他们是否完成了。如果你不知道,他们仍然需要循环文件的其余部分。我认为这可能会减少时间
awk'NR==15689{print;exit}'
谢谢!第一个代码只对我一行有效,所以对我来说不好。但是第二个代码非常有效!)你的
head
tail
sed
awk
是GNU版本还是苹果提供的版本?我想我用的是
GNU awk
,其余的都是苹果提供的。太好了!我喜欢这个解决方案,但行数对我来说并不总是一样的,也许,我也会把它记录为record numbers将花费比使用awk更多的时间。但是,我将尝试这两种方法,看看什么最适合我!非常感谢!!!只需再添加一条评论…如果sed已经完成了我要求的任务,为什么他要浏览整个文件?这真的毫无意义=/
head -15696 filename | tail -10
$ seq 1 100000000 > file

$ time (head -50000000 file | tail -10) > /dev/null
real    0m0.694s
user    0m0.830s
sys     0m0.333s

$ time (sed -n '49999991,50000000p' file) > /dev/null
real    0m6.018s
user    0m5.863s
sys     0m0.160s

$ time (sed -n '50000000q;49999991,50000000p' file) > /dev/null
real    0m3.197s
user    0m3.153s
sys     0m0.043s

$ time (awk 'NR>=49999991 && NR<=50000000' file) > /dev/null
real    0m12.665s
user    0m12.543s
sys     0m0.123s

$ time (awk 'NR>=49999991 && NR<=50000000{print} NR==50000001{exit}' file)
real    0m9.104s
user    0m9.010s
sys     0m0.100s