awk 2 つの大きなファイルをマージし、重複行を削除します。

awk 2 つの大きなファイルをマージし、重複行を削除します。

2つのファイルがあります。

A.txt - 約90GB
B.txt - 約80GB

両方のファイルをマージし、重複した行を削除したいと思います。

どうすればいいですか?

このコマンドに加えて、他のコマンドがawkそのタスクに適している場合はお知らせください。

答え1

awkハッシュは、すべての一意の行をメモリに保存するという意味なので、使用できません。したがって、出力ファイルがシステムで使用可能なメモリよりはるかに小さい場合にのみ使用できます。

入力ファイルがすでにソートされている場合は、次のことができます。

sort -mu A.txt B.txt > C.txt

ファイルのソートに使用されたのと同じソート順にロケールを変更する必要があるかもしれません。

これにより、ファイルごとに一度に複数の行をメモリに保存する必要がなくなります。

ソートされていない場合は、ディレクトリを削除し、170 GBの空き容量を持つファイルシステム(できるだけ高速なスペース)に-m設定して$TMPDIR待つ準備をします。

ただし、結果がソートされるため、後で必要に応じて他のファイルをマージする速度が速くなります。

sortメモリが少ないシステムでも動作するように一時ファイルが使用されます。しかし、メモリが多いほど良いです。 GNUの場合は、より良いパフォーマンスのために調整するのに役立つとオプションもsort参照してください。使用されるソート順序が重要でない場合は、ロケールを(with)に変更するのが最も効率的です。--compress-program--buffer-sizeCLC_ALL=C sort...

答え2

printf"">ファイルのマージ
catA.txt B.txt |
IFS =は-r行を読み取っています。
  もし[! -z "$line"];
    もし! grep -Fxqe "$line" MergFile;
      echo "$line">>ファイルのマージ;
    フィリピン諸島
  フィリピン諸島
完璧

説明する

#を使用して新しいMergeFileを作成するか、オプション
printf "">MergeFile で次の操作を行います。touch MergeFile

両方のファイルをwhileループにパイプします。
cat A.txt B.txt |

各行を読みなさい:
while IFS= read -r line; do

空白行の処理:
if [ ! -z "$line" ]; then
*最初の空白行を維持するには、else句にもう一度追加してください。

空の結果は、MergeFileが最初に入力されたことを意味します(つまり、唯一の項目です)。
if ! grep -Fxqe "$line" MergFile; then

マージファイルに以下を追加します。
echo "$line">>MergeFile;

答え3

次のコマンドを試してください。

cat A.txt B.txt | awk '!seen[$0]++' > C.txt

このような重いファイルを使用すると時間がかかることがあります。

関連情報