次のファイルがあります。
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