选择数组的元素而不在awk中指定数组

时间:2018-06-15 11:55:07

标签: arrays awk

我想从一个带有awk的文件中选择一个数组的特定元素,其中没有设置文件,指定每个条目都是数组的一部分。我计划将其置于for循环中或将其指定为用于算术运算的变量。但是,我发现在将其指定为变量或在for循环中使用它时,我无法使用我选择数组元素的方式。

1  2  3  4
5  6  7  8
9  8  7  6

如果awk中未指定这些元素作为数组的一部分,则可以使用

来引用它们。
FNR == 1 {print $3}

但是,我不能将其指定为稍后要使用的变量,也不能将其置于循环中。 有没有其他方法可以引用数组的单个元素而无需重构输入文件?

1 个答案:

答案 0 :(得分:0)

您可以将文件读入数组,然后访问该数组。访问阵列时,请使用split

{ array[NR] = $0 }

输入扫描完成后,array[42]会为您提供记录#42的内容,通常是输入的第42行。我们可以放入END { ... }块来处理数组。

要获得array[1]的第三个元素,我们可以这样做:

split(array[1], fields)

现在我们有一个名为fields的数组。 fields[3]保留与我们分配给$3的第一条记录时所持有的array[1]相同的数据。

在Awk中,我们还可以通过将多个索引连同一些明确的分隔符(如空格或短划线)来模拟二维数组。

{ for (i = 1; i <= NF; i++)
    array[NR "-" i] = $i }

对每个输入记录执行此操作后,我们可以从记录1中$3访问array["1-3"]。键1-3是一个字符串。

循环体中的表达式NR "-" i将几个表达式放在一起,两者之间没有运算符。这表示字符串连接。当NR为17且i为5时,我们会收到字符串"17-5",依此类推。

由于每条记录的字段数是可变的,我们可以使用另一个数组,为NF的每个元素提供array值。

{ nf[i] = NF;
  for (i = 1; i <= NF; i++)
    array[NR "-" i] = $i }

现在我们知道如果nf[17]为5,则array["17-1"]array["17-5"]字段有效。