2013-07-03 13 views
5

私はいくつかの大きなデータファイル(〜100MB-1GBのテキスト)と、関心のあるデータポイントをインデックスする数万のタイムスタンプのソートされたリストを持っています。タイムスタンプファイルは次のようになります。大きなファイルを徐々にグレープする

12345 
15467 
67256 
182387 
199364 
... 

とデータファイルは、次のようになります。

Line of text 
12345 0.234 0.123 2.321 
More text 
Some unimportant data 
14509 0.987 0.543 3.600 
More text 
15467 0.678 0.345 4.431 

二ファイル内のデータはすべて、タイムスタンプの順です。最初のタイムスタンプを使用して2番目のファイルをgrepし、タイムスタンプと4番目のデータ項目を出力ファイルに出力します。私はこれを使用しています:

grep -wf time.stamps data.file | awk '{print $1 "\t" $4 }' >> output.file 

これは、各データファイルを完了するのにかかる日数です。問題は、このコマンドはtime.stamps内のすべての行についてデータファイル全体を検索しますが、最後のデータポイントから検索する必要があるだけです。このプロセスをスピードアップする方法はありますか?

答えて

4

あなたは完全にawkでこれを行うことができます...

awk 'NR==FNR{a[$1]++;next}($1 in a){print $1,$4}' timestampfile datafile 
+1

+1:これはどういう仕組みか分かりましたが、スクリプトの最初の部分がすべてのタイムスタンプを配列 'a'にロードしていて、2番目の部分がデータファイルの最初のフィールドの配列を見ると、これはすべてのタイムスタンプを格納するだけのメモリが必要な非常に洗練されたソリューションであることがわかりました。 – Simon

+1

@Simonあなたは素早く学習する友達です。それはまさにそのことです。パフォーマンスをさらに向上させるには、配列要素が一致した後に配列要素を削除することができます。その要素がファイルの下で再び発生した場合、それは一致しませんが、次のスキャンのサイズが小さくなります。 –

+0

ニース!前に8時間かかっていた仕事は12秒かかります。 – user2548142

1

JS웃のawkソリューションは、おそらく行く方法です。 joinが利用可能で、無関係な "データ"の最初のフィールドが数値でない場合、ファイルが同じ順序であり、並べ替えの手順を避けることができます。この例では、Linuxでbashプロセス置換を使用しています

join -o2.1,2.4 -1 1 -2 1 key.txt <(awk '$1 ~ /^[[:digit:]]+$/' data.txt) 
0

「グレップ」ファイル名からパターンを取得し、マッチングを行い、ほとんど使用オプション-f filenameを持っています。 awkソリューションを打ち負かす可能性があり、タイムスタンプをソートする必要はありません。

関連する問題