2011-07-06 8 views
10

UNIX/Linuxスクリプトで多くのソートされたファイルをsort -mでマージしようとしていますが、sortが結果を一時ファイルに書き込んだ後、コピー先にコピーしています。 -mの私の理解では、ファイルがソートされていると仮定していたので、一時ファイルを使用することは完全に不要であり、ハードディスクスペースとCPUサイクルが浪費されます(私はsortをパイプラインに使用しています。)ソートされたファイルをマージするときにsortにテンポラリファイルを使用しないように指示する方法はありますか?または、より良いバージョンではありませんか?私はGNUのcoreutilsの5.97からsortを使用していソートされたファイルを一時ファイルを使用せずにマージするには?

$ sort -m -s -t '_' -k 1,1n -k 2,2n <(gunzip <file_1) [...] <(gunzip <file_n) | gzip >output 

:よう

正確なCLが見えます。

+0

私はsort'は、汎用ユーティリティとして書かれた 'ので、彼らはプログラムに多くの複雑さを追加するためのものとして、あなたのケースを考えるとそうTMPのSTDの並べ替えメカニズムに依存していなかったと思いますファイル。 ....あなたの入力ファイルのリストを巡回し、各1行目を比較し、1つのファイルから '最も低い'値を出力し、そのファイルから次のレコードを取得し、次にすべてのファイルを比較するawkスクリプトを書くのはかなり簡単でしょう。次の「最も低い」レコードを印刷するために再度記録する。開いているファイルのシステム制限に遭遇するかもしれませんが、これはあなたが作成したすべてのソリューションに当てはまります。最初にテストしてください。 Good Luck – shellter

答えて

3

man sortからこれらのオプションをチェックすると、マージに必要なスペースを最小限に抑えることができます。

--batch-size=NMERGE 

多くのNMERGE入力を一度にマージします。一時ファイルをさらに使用するために

--compress-program=PROG 

PROTを使用して一時ファイルを圧縮する。 PROG -dで解凍する

+0

これは、一時ファイルを防止する方法と一時ファイルが必要な理由を尋ねられたので、疑問に対する解決策ではありません。 あなたの回答は一時ファイルを減らすのに役立ちますが、それらを防ぐものではありません。大きなファイルの場合は、それでもまだ一時ファイルを使用します – user890739

+1

問題を解決します。マージするファイルの数よりも '--batch-size'を高く設定する必要があります。私はマージする31のファイルを持っていました。そのオプションを指定しないと、一時ファイルを使い始めました。 '--batch-size = 31'を設定すると、すぐに一時ファイルなしで出力を書き始めるようになりました。 – fatlasercat

0

GNU coreutils 6.10で動作していますが、この問題は発生していません。

コマンドラインについての1つのことは、コマンドを開始する前に<(...)リダイレクトが入力を一時ファイルに書き込むことです。それはあなたが見ている遅れかもしれませんか?

私は、このコマンドを実行しました:

sort -m a b c d e f g h i j | more 

をし、それが出力のために一時ファイルを作成しませんでした。出力をより多くパイプしてブロックして、/ procを調べてどのような並べ替えが行われているかを確認します。それはすべての入力ファイルをオープンし、パイプをmoreコマンドに持っていましたが、それはそれでした。一時ファイルいいえ:

$ ls -l /proc/1308/fd 
total 0 
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 0 -> /dev/pts/0 
l-wx------ 1 brianb brianb 64 2014-06-24 18:50 1 -> pipe:[217016034] 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 10 -> /home/brianb/h 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 11 -> /home/brianb/i 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 12 -> /home/brianb/j 
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 2 -> /dev/pts/0 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 3 -> /home/brianb/a 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 4 -> /home/brianb/b 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 5 -> /home/brianb/c 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 6 -> /home/brianb/d 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 7 -> /home/brianb/e 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 8 -> /home/brianb/f 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 9 -> /home/brianb/g 
関連する問題