私は巨大なデータファイル(約1億行)を処理するためにawkを使用しています。
私の表現はこれです -
tac <myfile> | awk -F',' 'OFS=\",\" {if(/^#/){print;}else{\$1=tolower(\$1);if(!seen[\$1]++)print;}}'|")
しかし、awkにメモリリークがあることがわかりました。誰かがここでメモリ使用量を指摘できますか?
ありがとうございます!
答え1
あなたが提供した行数に応じて交換することができると思います。
次のPerlスクリプトは、ディスクのBツリー(データベースで一般的です)を配列として使用します。 RAMメモリをほとんど使用しません。
$ cat remdup
#!/usr/bin/perl
use DB_File;
tie %seen, 'DB_File', "mydbfile.db", O_RDWR|O_CREAT|O_TRUNC ,0666, $DB_BTREE;
while(<>){
if(/^#/) { print; }
elsif(/(.*?),/) { $a=lc($1);
print if( ! $seen{$a}++)}
}
それにもかかわらず、処理に長い時間がかかります(5年後のラップトップで100万行を処理するのに16秒)。
使用法:tac file | perl remdup > output
編集:ソリューションを実行している場合はいつ実行するか教えてください。