- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 shell 脚本,并在其中使用 awk 脚本。我使用 -v
选项将参数从 shell 脚本传递给 awk
。在某些时候,当参数大小超过一定限制时,我收到“参数列表太长错误”。这是我之前的问题,但我已经找到了同样的根本原因。现在我的问题是:
Variable to be passed from shell to awk using -v option = too large ⟶ Hence getting argument list too long error
我的想法是将大变量分成小块并将其存储在数组中,然后将数组传递给 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]变量中[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]"=Apart of tempvariable; 等等...
最佳答案
你的 shell 似乎限制了你。我怀疑您的猜测是正确的,这不是 awk 问题,而是您调用 awk 的脚本语言问题。
您可以使用从文件加载的变量来预加载 awk。看看这个:
$ printf 'foo=2\nbar=3\nbaz=4\n' > vars
$ printf 'snarf\nblarg\nbaz\nsnurry\n' > text
$ awk 'NR==FNR{split($0,a,"=");vars[a[1]]=a[2];next} $1 in vars {print vars[$1]}' vars text
4
$
这是如何工作的?
前两行 printf 为我们提供了原始数据。如果您不完全清楚,请在不重定向的情况下运行它们(或对结果文件进行 cat 处理)。
awk 脚本有两个主要部分。 awk 脚本由 condition { commands }
的重复组成。在本例中,我们有两个这样的集合。
第一组的条件为 NR==FNR
。如果 awk 正在处理的当前记录号 (NR) 与当前文件中的当前记录号相同,则计算结果为“true”。显然,这只适用于第一个文件,因为从第二个文件的第一行开始,NR 是 1 加上第一个文件的行数。
在本节中,我们 split()
根据其等号确定该行,并将数据放入名为 vars
的数组中.
第二组的条件为 $1 in vars
,如果当前行的第一个单词作为 vars
的下标存在,则评估结果为 true大批。我仅将此作为您可以使用 var 执行的操作的示例,因为我不知道您要使用这些变量实现什么目的。
这能解决您的问题吗?如果没有,我们需要查看您的一些代码来了解如何修复它。
<小时/>更新根据评论中的建议,这里证明它适用于大变量:
首先,我们准备输入数据:
$ dd if=/dev/random of=out.rand count=128k bs=1k
131072+0 records in
131072+0 records out
134217728 bytes transferred in 3.265765 secs (41098404 bytes/sec)
$ b64encode -o out.b64 out.rand out.rand
$ ls -lh out.b64
-rw-r--r-- 1 ghoti wheel 172M Jul 17 01:08 out.b64
$ awk 'BEGIN{printf("foo=")} NR>1{printf("%s",$0)} END{print ""}' out.b64 > vars
$ ls -lh vars
-rw-r--r-- 1 ghoti wheel 170M Jul 17 01:10 vars
$ wc -l vars
1 vars
$ cut -c1-30 vars
foo=orq0UgQJyUAcwJV0SenJrSHu3j
好的,我们在一行上有一个大约 170MB 的变量。让我们将其吸入 awk 中。
$ awk 'NR==FNR{split($0,a,"=");vars[a[1]]=a[2];next} END{print length(vars["foo"]);print "foo=" substr(vars["foo"],0,26);}' out.var bar
178956971
foo=orq0UgQJyUAcwJV0SenJrSHu3j
我们可以看到变量的大小,前 26 个字符与我们从 shell 中看到的相符。是的,它有效。
关于shell - 将参数作为数组从 shell 传递到 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515328/
是否可以从 awk 文件执行另一个 awk 文件?使用 awk 文件我需要执行当前文件夹中的所有 awk 文件。是否可以在 awk 中进行此类操作? 最佳答案 是的你可以。您需要使用 system()
这是一个 awk 脚本,它尝试根据第一列设置两个文件的差异: BEGIN{ OFS=FS="\t" file = ARGV[1] while (getline < file)
awk 逐行处理文件。假设每一行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据? 最佳答案 唯一试图提供 awk 并行实现的
我有文件: 结果.txt Apple fruits 10 20 30 Car vehicle 40 50 60 Book study 70 80 90 假设这里第 2 列是特征,第 3 列是最小值
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对 awk 的行为感到惊讶表演时浮点数 计算。它导致我对表格数据进行错误计算。 $ awk 'BEGIN {print 2.3/0.1}' 23 0.1}' )。 那么我应该如何执行大于 (
为什么我在下面的例子中得到分隔符前后的空格? awk -F'^' '{print $1,":",$2}' SERVER_2012-02-29-12-15-00 3969 : 1272 3969 :
我有一个文件,其中每四行是这样的: HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG (对于那些感兴趣的人,此文件包含DNA序列) 我需
你能帮我按 $2 列中的坐标合并行吗?有一系列坐标以一个为单位增长。我想输出 f.e. :第 1 行合并到第 4 行 9079811-9079814,之后没有系列,因此将其合并到另一行等。对于输入中的
大家好,我是 awk 的新手,我可以问一下我有这样的输入文件吗: # ABC DEFG value1 GH value2 GH value3 GH # BCF SQW value4 GH value5
大家好,我想问一下,我对awk中的括号{}感到非常困惑,就像我写了一段代码 { FNR == 3 { print $1 " age is " $2 } } 但它在外括号上给了我错误但没有在打印语
我想知道如何在 awk 中使用多行注释。到目前为止,我一直在使用 # 来评论一行。有人可以就此指导我。谢谢你。 最佳答案 AWK 中没有多行注释,但如果需要,您可以伪造它。这是一种至少适用于 GNU
关于AND逻辑运算符的一个基本问题。我试图根据第1列和第2列的值提取数据文件niveles.csv中的某些字段。我想写一个awk语句,说“当field1 = date和field2 = area然后打
以下命令按预期工作。 # some command | awk '/(\|\|\)/,/;/' create table todel1 (id int) max_rows=2 /*!*/; alter
我有一个日志文件,需要在服务器上“重播”。 它包含这样的条目: Request: query: EXEC prc_insert_customer @param0: 11
如何从制表符分隔的字符串中选择第一列? # echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{prin
我正在尝试在目录中的多个文件的内容中执行一些 grep 并将我的 grep 匹配附加到单个文件中,在我的输出中我还想要一个包含文件名的列,以了解哪些文件条目已被拾取。我试图使用 awk 来实现相同的目
我想选择文件中第9列的绝对值小于500的行。列有时为正,有时为负。 awk -F'\t' '{ if ($9 output.bam 到目前为止这不起作用..互联网上的一轮告诉我,要使用绝对值,我们应
例如,假设我运行以下命令: gawk -f AppendMapping.awk Reference.tsv TrueInput.tsv 假设文件名会改变。在遍历第一个文件时,我想创建一个映射。 map
我正在使用这个命令; awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}' 这警告我; awk: warnin
我是一名优秀的程序员,十分优秀!