数组索引是中的整数或带引号的字符串awk
。您在此处使用的是尚未初始化的变量。因此,它们的值是空的。
您会获得分配给数组的最新值,因为每个分配都将覆盖先前的值。使用print arr[""]
也会给您带来10
回报。
而是使用字符串,如中所述arr["A"]=1
。
对于您的最后一个问题:没有awk
从命令行初始化数组的真正工具,但是您可以传递在BEGIN
块中“解码”的“已编码”值(例如)以提取数组的键和值。
该示例将一个特殊定界的列表作为单个字符串传递,并对其进行解析以提取要使用的索引和值:
awk -v vals="A=1:B=1:C=1:E=1:J=8:Q=10" '
BEGIN {
n = split(vals, v, ":")
for (i = 1; i <= n; ++i) {
split(v[i], a, "=")
arr[a[1]] = a[2]
}
print arr["J"]
}'
使用单独的键和值:
awk -v keys="A:B:C:E:J:Q" -v vals="1:1:1:1:8:10" '
BEGIN {
nk = split(keys, k, ":")
nv = split(vals, v, ":")
if (nk != nv) exit 1
for (i = 1; i <= nk; ++i)
arr[k[i]] = v[i]
print arr["J"]
}'
这是将“数组”传递到中的一种有限方式awk
,但是它适用于可以完全控制的简单值。对于将冒号(在第一个示例中为等号)嵌入到实际数据中的任何数据,这些示例都会破坏。
像这样传递数据还意味着必须对数据中的反斜杠进行特殊处理(\n
将是换行符,因此要传递两个字符串\n
,您必须使用"\\\n"
或'\\n'
)。
也相关:
顺便说一句,您可以编写一个“纯awk
脚本”,如下所示:
#!/usr/bin/awk -f
BEGIN {
# some initialisations
}
some_expression { some code }
END {
# more here
}