将2个文件的内容写入另一个文件

将2个文件的内容写入另一个文件

我们的一个脚本正在将 2 个文件的内容写入另一个文件,以下命令需要 4 分钟。文件1有头记录,文件2有4GB的数据。在文件 3 上,标头记录应位于顶部,然后是文件 2 的内容。

有没有更好的方法可以在 4 分钟内实现这一目标。

cat file1 file2 > file3

谢谢拉古

答案1

只需进行几个本地测试,该sed h file >> destination命令就会快大约 66%,然后cat您必须稍微重写脚本才能添加第二个命令,因为sed只接受单个文件参数,但无论哪种方式,它仍然会更快。

编辑:测试使用了 4GB 的随机文本文件和 unicode 字符时间,通过time命令测量。

答案2

我的旧笔记本电脑的硬盘速度大约是你的两倍。

我怀疑您可能正在从 BusyBox 运行猫,而不是优化的独立猫。

我检查了四个命令的计时,它们的结果都大致相同(10% 以内)。我使用了 GNU cat、sed、awk 和 dd。我在每次测试之前清除了缓存(在另一个窗口中作为 sudo)
echo 3 > /proc/sys/vm/drop_caches

sed 确实(顺便说一句)处理多个输入文件。

$ time cat Timer1 Timer2 > Timer3

real    1m57.536s
user    0m0.072s
sys     0m20.456s
$ 
$ time sed -e '1n' Timer1 Timer2 > Timer3

real    1m54.450s
user    0m15.924s
sys     0m23.420s
$ 
$ time awk 1 Timer1 Timer2 > Timer3

real    2m0.080s
user    0m21.752s
sys     0m21.444s
$ 
$ time { cat Timer1 > Timer3
>     dd status=none conv=notrunc oflag=append bs=100M if=Timer2 of=Timer3
> }
$

real    2m9.426s
user    0m0.012s
sys 0m18.260s
$
$ ls -lh Timer?
-rw-r--r-- 1 paul paul   17 Mar  7 11:01 Timer1
-rw-r--r-- 1 paul paul 3.7G Mar  7 11:03 Timer2
-rw-r--r-- 1 paul paul 3.7G Mar  7 11:50 Timer3
$ 
$ ls -l Timer?
-rw-r--r-- 1 paul paul         17 Mar  7 11:01 Timer1
-rw-r--r-- 1 paul paul 3942530050 Mar  7 11:03 Timer2
-rw-r--r-- 1 paul paul 3942530067 Mar  7 12:06 Timer3

这表明时序主要由 I/O 性能决定,而使用的命令则不太重要。 (使用 shell 读取循环仍然不是一个好主意。)

但值得注意的是,cat 和 dd 使用的用户时间比编辑工具少得多。

相关内容