如何将数组的值作为第二个参数传递给 awk 的 split 函数?
Posted
技术标签:
【中文标题】如何将数组的值作为第二个参数传递给 awk 的 split 函数?【英文标题】:How to pass the value of an array as a second argument to awk's split function? 【发布时间】:2021-07-14 17:14:27 【问题描述】:我知道在 awk 中我们通过引用传递数组元素,但我想知道是否有按值传递的方法?我正在尝试在 for 循环中使用内置拆分函数,并且需要从另一个数组中获取第二个参数(数组名称)并稍后引用它。我目前正在运行以下命令;
echo "test this" | awk 'BEGIN
arraynametest[1] = "arrayone";
for (i=1; i <= length(arraynametest); i++)
split($0, arraynametest[i], /\[\[:blank:]]/);
END
print "test array with index ", i, " = ", arrayone[i]
'
有输出;
awk: cmd. line:1: fatal: split: second argument is not an array
即使我修改为先将数组值存储到变量中并使用 var 它也不起作用;
echo "test this" | awk 'BEGIN arraynametest[1] = "arrayone"; for (i=1; i <= length(arraynametest); i++) arrayname = arraynametest[1]; split($0, arrayname, /\[\[:blank:]]/); END print "test array with index ", i, " = ", arrayname[i] '
同样的输出;
awk: cmd. line:1: fatal: split: second argument is not an array
我知道这将是由于数组元素被作为引用传递。有没有办法解决这个问题?
我的预期输出是;
test array with index 1 = test
【问题讨论】:
通过在一个有 1 个条目的数组上的循环中调用 split() 而不是只调用一次,然后使用 @987654326 的第三个参数调用 split(),你真的混淆了你的问题@ 看起来很奇怪,并且您的输入中不存在该字符串。您的示例可能就像询问如何做var="arrayone"; split($0,var)
一样简单。
【参考方案1】:
您不能在数组上下文中使用标量,反之亦然。处理此问题的一种方法是使用多维数组,其中您的第一个索引可以是数组名称(为什么不直接使用索引?)示例代码的简化版本...
$ echo "test this" |
awk 'arraynames[1] = "arrayone";
data[arraynames[1]][1];
split($0, data[arraynames[1]]);
print "test array with name = " (name=arraynames[1]) ", value at index 1 = " data[name][1]'
test array with name = arrayone, value at index 1 = test
另请注意,BEGIN
块中的 $0
未被读取,因此即使您修复标量/数组混合,您也不会得到任何输出。
【讨论】:
感谢@karakfa!对于 BEGIN 块,您当然是对的。我在尝试提出 mre 时忘记了这一点,我没有在实际脚本的 BEGIN 中使用它。就索引建议而言,它使我的代码在脚本后面更易于阅读。感谢帮助:) 你应该提到需要一个支持数组数组的 awk 变体,例如GNU awk。以上是关于如何将数组的值作为第二个参数传递给 awk 的 split 函数?的主要内容,如果未能解决你的问题,请参考以下文章