ソースファイルからコンテンツに基づいて異なるファイルに行を再配布するために使用される(G | M)awkスクリプトがあります。一例は、ソース・データのセットを行のタイム・スタンプに基づいて別々の日付付きファイルにシャーディングすることです。Awk getlineは徐々に時間がかかります
私はcsvヘッダー行を追加する必要があるまで十分に速いです。ソースデータは順不同ですので、if (getline < (fname) < 0) { print cols > fname }
を使用して、最初のタッチ時にヘッダー行を含む各宛先ファイルを作成することを検討しました。
ソースデータの各行についてこのテストが高価になる可能性がありますが、宛先ファイルが作成されると、処理されるソースファイルの速度が遅くなるため、各getline
テストに時間がかかります。減速はパフォーマンス上の問題です。
このプロセスもGNU並列で実行されるため、system -f
テストはシステムコールでハングしません。
ヘッダーを含むファイルを作成する際のパフォーマンスを改善する方法についての提案はありますか?他のロジックが既にあるので、このスクリプトをAwkに保存しておきたい。
タスクの例として、私は、ログエントリの日付に基づいてファイルに結合する必要があり、複数のホストからのログを持っている:
date, time, measure
2017-01-01, 00:00, 10
2017-01-01, 01:00, 20
2017-01-03, 00:05, 30
2017-01-02, 02:10, 40
2017-01-03, 00:00, 50
をこのスクリプトの結果は次のようになり日付列に基づいて3つのファイル:
ファイル名:20170101.log
date, time, measure
2017-01-01, 00:00, 10
2017-01-01, 01:00, 20
ファイル名:
date, time, measure
2017-01-02, 02:10, 40
ファイル名を20170102.log:列ヘッダを含める必要が遊びに来るまで、このログ組換えが迅速かつ簡単です実行
date, time, measure
2017-01-03, 00:05, 30
2017-01-03, 00:00, 50
20170103.log。宛先ファイルが増えるにつれて、getline
の操作にはそれぞれの呼び出しに時間がかかるようです。他の例では、test -f
にファイルの存在を示すsystem
の呼び出しを使用していますが、これも高価な操作であり、GNU Parallelでハングしているようです。
パフォーマンスが向上しますgetline' 'なしの単純なアプローチは、おそらくそこにあります。簡単なテスト入力と希望の出力を提供すると、より多くのヘルプが得られます。 – karakfa
例が追加されました。このためにAwkより優れたアプローチがありますが、現時点では既存の関連コードを再作成しないようにしています。 – MattK