我正在使用 shell 脚本,其中我正在使用 awk 脚本。我awk
通过使用-v
选项将参数传递给 shell 脚本。在某个时间点,当参数大小超过某个限制时,我收到“参数列表太长错误”。这是我之前的问题,但我已经找到了相同的根本原因。现在我的问题是:
使用 -v 选项将变量从 shell 传递到 awk = too large ⟶ 因此获取参数列表太长错误
我的想法是将大变量分成小块并将其存储在一个数组中,然后将数组传递给awk
而不是将单个变量传递给awk
.
我的问题是:
- 是否可以将大变量分解为小数组,然后将其传递回
awk
. 我知道如何在awk
脚本中修改 shell 变量。但是如何修改awk
脚本中的 shell 数组呢?
我读到 -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] 和 feed addvariable[1]、[2],而不是作为一个整体提供整个 addvariable。所以我的问题是如何将它作为一个数组提供。以及如何将awk中的大数据存储到变量[1]变量[2]中
代码 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 被嵌入到 shell 中。每次我需要将 awkarray 内容再次反馈到 awk 时.. 这样我就能够获得更新的内容,这就是我通过再次打印 shell 变量来获取 shell 变量中的 awk 数组内容的原因存储在另一个 shell 变量“addshellvariable”中,并在下一次迭代中将其提供给 awk。但问题是当 shellvariable 大小增加某个点时,我得到一个 Argument too long 错误。因此,我想要一个解决方案,而不是
print "shellvariable"=tempvariable; 我可以把它做成print "shellvariable[1]"=A part of tempvariable; 等等 ...