両方のファイルの内容を別のファイルに書き込む

両方のファイルの内容を別のファイルに書き込む

私たちのスクリプトの1つは、2つのファイルの内容を別のファイルに書き込むことです。次のコマンドは4分かかります。ファイル1にはヘッダーレコードがあり、ファイル2には4GBのデータがあります。ファイル3では、ヘッダーレコードが一番上になければならず、その後にファイル2の内容が続くはずです。

4分でこれを達成するためのより良い方法はありますか?

cat file1 file2 > file3

ありがとうございます

答え1

数回のローカルテストでは、このsed h file >> destinationコマンドは約66%高速で、単一のファイル引数しか許可されていないため、cat2番目のコマンドを追加するためにスクリプトを少し書き換える必要がありますsedが、どちらもまだ高速です。

編集:コマンドで測定された4GBランダムテキストファイルとUnicode文字時間を使用してテストされましたtime

答え2

私の古いラップトップのハードドライブはあなたのハードドライブより約2倍速かった。

最適化されたスタンドアロンの猫ではなく、BusyBoxで猫を実行しているようです。

4つのコマンドのタイミングを確認しましたが、すべてほぼ同じ結果(10%以内)を示しました。私はGNU cat、sed、awk、ddを使用しました。各テストの前にキャッシュを消去しました(別のウィンドウからsudoに)
echo 3 > /proc/sys/vm/drop_caches

sed は (btw) 複数の入力ファイルを処理します。

$ 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パフォーマンスによって決定され、使用されるコマンドがそれほど重要ではないことを示しています。 (シェル読み取りループを使用することはまだ良い考えではありません。)

しかし、catとddは編集ツールよりもユーザー時間をはるかに少なく使用することは注目に値します。

関連情報