第一次发帖,所以请善待.我正在读取文件"bar",一次一行,并使用sed替换"foo"中的所有其他行(从第一行开始),并从"bar"读取行.下面的代码可以工作,但是当"foo"是48,890行而"bar"是~24,445行(正好是半个foo的长度)时,它很慢.
有没有人建议如何加快这个过程?
x=1
while read i;do
sed -i "$x s/^.*$/$i/" foo
x=$[$x +2]
done < bar
Run Code Online (Sandbox Code Playgroud)
交错paste和awk:
paste -d '\n' bar <(awk 'NR%2==0' foo)
Run Code Online (Sandbox Code Playgroud)
或者,如果没有进程替换:
awk 'NR%2==0' foo | paste -d '\n' bar -
Run Code Online (Sandbox Code Playgroud)
要替换foo:
paste -d '\n' bar <(awk 'NR%2==0' foo) > tmp && mv tmp foo
Run Code Online (Sandbox Code Playgroud)
要么
awk 'NR%2==0' foo | paste -d '\n' bar - > tmp && mv tmp foo
Run Code Online (Sandbox Code Playgroud)
我基准测试了一点(只是执行时间,忽略了内存要求).
创建输入文件(大约是问题中的十倍):
$ dd if=/dev/urandom count=500000 | tr -cd [:alpha:] | fold -w 100 |
> sed 's/^/foo /' > foo
$ dd if=/dev/urandom count=250000 | tr -cd [:alpha:] | fold -w 100 |
> sed 's/^/bar /' > bar
$ wc -l foo bar
539994 foo
270126 bar
810120 total
Run Code Online (Sandbox Code Playgroud)
我曾经time测量过执行时间.所有解决方案的输出都重定向到新文件.以秒为单位的结果,平均每次尝试五次:
codeforester 9.878
codeforester, mapfile 8.072
Fred 17.332
Charles Duffy 'Argument list too long"
Claude 27.448
Barmar 0.298
Benjamin W. 0.176
Run Code Online (Sandbox Code Playgroud)
查尔斯也以这里使用的10%大小的输入爆炸了.
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |