複数のgzipファイルから重複したアイテムをマージ、ソート、および削除します。

複数のgzipファイルから重複したアイテムをマージ、ソート、および削除します。

15個の異なるgzipファイルをマージします。各ファイルのサイズは 2 GB から 15 GB まで異なるため、ファイルのサイズが比較的大きくなります。最良の方法を研究しましたが、まだいくつかの問題があります。

要約:

15の異なるgzipファイルから始めて、gzip形式の並べ替えられ、繰り返される無料ファイルで仕上げたいと思います。

会話を簡単にするために、ファイルを次のように表示しましたfile1file2file15

sortオプションでコマンドを使用します-u。 sortのマニュアルページによると、これは次のことを意味します。

-u, --unique with -c, check for strict ordering; without -c, output only the first of an equal run

だから私がしたいことは次のとおりです。

sort -u file* > sortedFile

私が理解したのは、重複せずに並べ替えられたファイルがあることです。私が作成したテストファイルによると、これは本当のようですが、これが正しいことを確認したいですか?

今ジレンマに別の問題が発生します。

すべてのファイルがgzip形式なので、最初にgzipからテキストファイルに変換して結合してから、再びgzipに圧縮せずにzcatまたは他の方法を使用して出力をパイピングして並べ替える方法はありますか?これにより、多くの時間が節約されます。どんな意見でも感謝します。私はこれについてのアドバイスを探しています。私は研究を嫌うか、私のアプローチにこだわらない。 120GBのデータに対してこれらのコマンドを実行する前に、少しの洞察が必要です。

ありがとうございます!

ベストアンサー1

問題は、個々のファイルがソートされていないことです。つまり、そのようなものを使用している場合は、sort -u file* > sortedFileソートするにはすべてのファイルの内容をロードしてソートする必要があります。おそらく120GB以上のメモリがないので、これは非効率的だと思います。

まず、すべてのファイルを個別にソートしてから、を使用してマージすることをお勧めしますsort -m(このコードはテストされていません!)。

for f in file*; do
  gzip -dc "$f" | sort > sorted.$f.bak
done
sort -m -u sorted.file*.bak > sortedFile
rm -f sorted.file*.bak

マニュアルページの関連部分を並べ替えます(例:http://unixhelp.ed.ac.uk/CGI/man-cgi?sort):

-m、--mergeソートされたファイルをマージしません。

修正する:読んでからhttps://stackoverflow.com/questions/930044/how-could-the-unix-sort-command-sort-a-very-large-fileとにかく、sortは入力を管理可能な塊に分割するので、元のコマンドはおそらくそれほど速いと思います。コマンドラインは次のとおりです。

 sort <(zcat file1) <(zcat file2) ... <(zcat file15) > sortedFile

これにより、マシンの複数のコアを使用することもできます。

おすすめ記事