加速从文件中读取的sed替换字符串

Jea*_*ers 3 bash sed

第一次发帖,所以请善待.我正在读取文件"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)

Ben*_* W. 6

交错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%大小的输入爆炸了.