【问题标题】:How to pass the value of an array as a second argument to awk's split function?如何将数组的值作为第二个参数传递给 awk 的 split 函数?
【发布时间】: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) 一样简单。

标签: arrays for-loop awk


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多