私はシェル スクリプトを使用しており、その中で awk スクリプトを使用しています。awk
オプションを使用してシェルスクリプトからパラメータを渡してい-v
ます。ある時点で、引数のサイズが特定の制限を超えると、「引数リストが長すぎます」というエラーが発生しました。これは私の以前の質問でしたが、同じ根本的な原因を見つけました。今私の質問は:
-vオプションを使用してシェルからawkに渡される変数=大きすぎる⟶したがって、引数リストが長すぎるエラーを取得しています
awk
私の考えは、大きな変数を小さなチャンクに分割して配列に格納し、単一の変数を に渡す代わりに、配列をに渡すことawk
です。
私の質問は:
- 大きな変数を小さな配列に分割してから、に戻すことは可能ですか
awk
?awk
スクリプト内でシェルの変数を変更する方法を知っています。awk
しかし、スクリプト内のシェルの配列を変更するにはどうすればよいでしょうか?
-v オプションはお勧めできないと読み、変数値をパイプすることを提案しました。だからもしそうだったら
echo variable | awk '{}'
したがって、変数はパイプされます。しかし、他の変数と一緒に配列をパイプする必要があります。手伝っていただけませんか?
CODE DESCRIPTION
addvariable=""
export variable
loop begins
eval $(awk -v tempvariable="$addvariable" '{tempvariable=tempvariable+"long string" variable=tempvariable(Here is where the shell variable(variable) is being modified )}')
In shell
addvariable=$variable (Taking the new value of shell variable and feeding back to awk in the next iteration)
loop ends
したがって、問題は addvariable と variable が増加し続けるため、引数が長すぎるというエラーが発生することです..だから私がしなければならないことは、tempvariable を小さなチャンクに分割してから variable[1] variable[2] に格納することですなど、それを addvariable[1]、addvariable[2] とフィード addvariable[1]、[2] に割り当てます。awk内のビッグデータを変数[1]変数[2]に保存する方法
CODE addshellvariable=""
for i in {0..10}
{
zcat normalfile{i} > FILE A
zcat hugefile{i} > FILE
export shellvariable=""
getdate=grep "XXX" FILE B|sort|Uniq (getdate contains a list of id's)
eval $(awk -v getdata="$getdata" -v addshellvariable="$addshellvariable" BEGIN {tempvariable="";split(addshellvariable,tempshellvariableArray,"*");while(t <= length(tempshellvariable)) {awkarray[tempshellvariableArray[t]];} {for(id in ids) {awkarray[id];} END {for(id in awkarray) {tempvariable=tempvariable"*"id"*"awkarray[id]} **print "shellvariable"=tempvariable;**}} FILE A)
addshellvariable=$shellvariable;
}
ご覧のとおり、シェル内に awk が埋め込まれています。awkarray コンテンツを awk に再度フィードバックする必要があるたびに..更新されたものを取得できるようにするため、それを印刷してシェル変数で awk 配列コンテンツを取得している理由です。別のシェル変数「addshellvariable」に格納され、次の反復で awk に渡されます。しかし問題は、シェル変数のサイズが特定のポイントを超えると、 Argument too long エラーが発生することです。したがって、
print "shellvariable"=tempvariable;を実行する代わりに、次のような方法で解決策が必要でした。print "shellvariable[1]"=A part of tempvariable; として作成できます。等々 ...