毎日約200,000行ずつ増えるファイルがあり、すべて次のように3行からなる塊で構成されています。
1358726575123 # key
Joseph Muller # name
carpenter # job
9973834728345
Andres Smith
student
7836472098652
Mariah Anthony
dentist
現在、約10,000の主要パターンを抽出した別のファイルがあります1358726575123
。その後、for
これらのパターンでループを実行し、最初のファイルと比較する必要があります。ファイルにこれらのパターンが含まれていない場合は、さらに処理するために3番目のファイルにパターンを保存します。
for number in $(grep -o '[0-9]\{12\}' file2); do # finds about 10.000 keys
if ! grep -q ^$number$ file1; then # file1 is a huge file
printf "$number\n" >>file3 # we'll process file3 later
fi
done
サンプルコードは大きなファイルを10,000回grepします。私はこのループを約10,000回実行します。1分に1回、一日中。
大容量ファイルが増え続けていますが、これらすべてをすばやく作成し、いくつかのCPUを節約するにはどうすればよいですか?キーごとにファイルを並べ替えるか(それではどうすれば?)、プレーンテキストの代わりにデータベースを使用するのが役に立つかどうか疑問に思います。
ベストアンサー1
もちろん、問題は大きなファイルに対してgrepを10,000回実行することです。両方のファイルを一度だけ読み取る必要があります。スクリプト言語を使用したくない場合は、次のようにします。
- ファイル1からすべての数値を抽出してソートします。
- ファイル2からすべての数値を抽出してソートします。
comm
2番目のリストの内容だけを取得するには、ソートされたリストを実行してください。
このような:
$ grep -o '^[0-9]\{12\}$' file1 | sort -u -o file1.sorted
$ grep -o '[0-9]\{12\}' file2 | sort -u -o file2.sorted
$ comm -13 file1.sorted file2.sorted > file3
望むよりman comm
。
ログファイルなどの大容量ファイルを毎日切り捨てることができる場合は、ソートされた数のキャッシュを保持でき、毎回解析する必要はありません。