内部で awk スクリプトを呼び出すシェル スクリプト プログラムを作成しています。これが私のスクリプトです。
for FILE in `eval echo{0..$fileIterator}`
{
if(FILE == $fileIterator)
{
printindicator =1;
}
grep RECORD FILEARRAY[FILE]| awk 'for(i=1;i<=NF;i++) {if($i ~ XXXX) {XARRAY[$i]++}} END {if(printIndicator==1){for(element in XARRAY){print element >> FILE B}}'
私のコードが明確であることを願っています。他に詳細が必要な場合はお知らせください。
問題
このプログラムでの私の動機は、すべてのファイルをトラバースして、すべてのファイルで「XXXX」を含む行を取得し、その行を配列に格納することです。それが私がここでやっていることです。最後に、配列変数の内容をファイルに保存する必要があります。以下のように、各ステップでコンテンツを保存できます
{if($i ~ XXXX) {XARRAY[$i]++; print XARRAY[$i] >> FILE B}}
しかし、このアプローチに行かない理由は、毎回 I/O 操作を行う必要があるためです。これには時間がかかります。そのため、毎回それをインメモリに変換し、最後にインメモリ配列をダンプしています( XARRAY) をファイルに追加します。
ここで私が直面している問題はそれです。シェル スクリプトは awk を毎回呼び出し、データは配列 (XARRAY) に格納されますが、次の反復では、XARRAY の以前の内容が削除され、これが新しい配列と見なされるため、新しい内容が配置されます。したがって、最後にコンテンツを印刷すると、最近更新された XARRAY のみが印刷され、これから期待されるすべてのデータは印刷されません。
予想される提案
1) awk スクリプトに、XARRAY が古いものであり、各反復で毎回呼び出されているときに新しいものではないことを認識させる方法。
2) 別の方法の 1 つは、毎回 I/O を実行することです。しかし、私はこれに興味がありません。これ以外に代替手段はありますか?ありがとうございました。