我想从一个带有awk的文件中选择一个数组的特定元素,其中没有设置文件,指定每个条目都是数组的一部分。我计划将其置于for循环中或将其指定为用于算术运算的变量。但是,我发现在将其指定为变量或在for循环中使用它时,我无法使用我选择数组元素的方式。
1 2 3 4
5 6 7 8
9 8 7 6
如果awk中未指定这些元素作为数组的一部分,则可以使用
来引用它们。FNR == 1 {print $3}
但是,我不能将其指定为稍后要使用的变量,也不能将其置于循环中。 有没有其他方法可以引用数组的单个元素而无需重构输入文件?
答案 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"]
字段有效。