大きなファイルから最初の数列が同じ2行目を削除する

大きなファイルから最初の数列が同じ2行目を削除する

次のファイルがあります。

A 1 abc
A 1 def
A 2 ttt
B 2 ppp
B 2 qqq

最初の2つのキーが同じ場合、最初の行を維持したいと思います。これを行います。

A 1 abc
A 2 ttt
B 2 ppp

私が一つ見つけた前の質問これで問題が解決しました。しかし、私のファイルサイズは1.2GBで、最初の19列に一致します。だからこれを実行すると:

  awk  '!array[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19]++' infile > outfile

わかりました:

cmd. line:2: (FILENAME=infile FNR=287807) fatal: dupnode: r->stptr: can't allocate memory (Not enough memory)

明らかに、重複したファイルがどこにあるかわからないため、処理するファイルを分割することはできません。この問題を解決するために、メモリと速度を喜んで交換します。 (ファイルには約160万行があります。)

ベストアンサー1

ファイルがソートされているようです。

sort -m -u -k 1,2 < file

-m~のためマージファイルを並べ替える試みは行われませんが、代わりに-u(例:ユニーク-k 1,2)最初の2つのフィールド(最初の19フィールド)で構成されたソートキーを指定することと組み合わせて、-k 1,19最初の2つのフィールドから重複する項目を削除します。

ファイルがソートされていない場合(少なくとも2つのフィールドで)、削除するだけです-m。しかし、結果は最終的にソートされます。ソートはコストがかかりますが、メモリ側では、大容量ファイルをソートするために一時ファイルが使用されるため(sort使用可能なディスク容量が必要な場合もあります)、大丈夫です。/tmp$TMPDIR

おすすめ記事