如何将数组的值作为第二个参数传递给 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章

当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]

将对象的属性作为第二个参数传递给jQuery函数本身

如何将命令输出作为多个参数传递给另一个命令

c# 请问数组能作为参数传递吗? 如果可以如何传递呢?

如何将参数传递给我的处理程序

将数组作为参数传递给 C 中的函数