使用awk存储多维数组
Storing Mulitdimensional array using awk
我的输入文件是
a|b|c|d
w|r|g|h
我想像
一样将值存储在数组中
a[1,1] = a
a[1,2] = b
a[2,1] = w
请以任何方式建议在 awk 中实现此目的 bash。
我有两个 i/p 文件,需要进行字段级验证。
这会将文件解析为 awk 数组:
awk -F \| '{ for(i = 1; i <= NF; ++i) a[NR,i] = $i }' filename
当然,您必须添加使用该数组的代码才能发挥作用。因为你没有说你想在数组完成后(在传递文件之后)做什么,这就是我能给你的所有答案。
像这样
awk -F'|' '{for(i=1;i<=NF;i++)a[NR,i]=$i}
END {print a[1,1],a[2,2]}' file
输出
阿
如果您使用多维数组,您真的会想要 get/use gawk 4.*,因为这是唯一支持它们的 awk。当你写:
a[1,2]
在任何 awk 中,您实际上是在创建一个伪多维数组,它是由
串联形成的字符串索引的一维数组
1 SUBSEP 2
其中 SUBSEP 是不太可能出现在您的输入中的控制字符。
在 GNU awk 4.* 中你可以这样做:
a[1][2]
(注意不同的语法)并填充实际的多维数组。
试试看区别:
$ cat tst.awk
BEGIN {
SUBSEP=":" # just to make it visible when printing
oneD[1,2] = "a"
oneD[1,3] = "b"
twoD[1][2] = "c"
twoD[1][3] = "d"
for (idx in oneD) {
print "oneD", idx, oneD[idx]
}
print ""
for (idx1 in twoD) {
print "twoD", idx1
for (idx2 in twoD[idx1]) { # you CANNOT do this with oneD
print "twoD", idx1, idx2, twoD[idx1][idx2]
}
}
}
$ awk -f tst.awk
oneD 1:2 a
oneD 1:3 b
twoD 1
twoD 1 2 c
twoD 1 3 d
我的输入文件是
a|b|c|d
w|r|g|h
我想像
一样将值存储在数组中a[1,1] = a
a[1,2] = b
a[2,1] = w
请以任何方式建议在 awk 中实现此目的 bash。
我有两个 i/p 文件,需要进行字段级验证。
这会将文件解析为 awk 数组:
awk -F \| '{ for(i = 1; i <= NF; ++i) a[NR,i] = $i }' filename
当然,您必须添加使用该数组的代码才能发挥作用。因为你没有说你想在数组完成后(在传递文件之后)做什么,这就是我能给你的所有答案。
像这样
awk -F'|' '{for(i=1;i<=NF;i++)a[NR,i]=$i}
END {print a[1,1],a[2,2]}' file
输出
阿
如果您使用多维数组,您真的会想要 get/use gawk 4.*,因为这是唯一支持它们的 awk。当你写:
a[1,2]
在任何 awk 中,您实际上是在创建一个伪多维数组,它是由
串联形成的字符串索引的一维数组1 SUBSEP 2
其中 SUBSEP 是不太可能出现在您的输入中的控制字符。
在 GNU awk 4.* 中你可以这样做:
a[1][2]
(注意不同的语法)并填充实际的多维数组。
试试看区别:
$ cat tst.awk
BEGIN {
SUBSEP=":" # just to make it visible when printing
oneD[1,2] = "a"
oneD[1,3] = "b"
twoD[1][2] = "c"
twoD[1][3] = "d"
for (idx in oneD) {
print "oneD", idx, oneD[idx]
}
print ""
for (idx1 in twoD) {
print "twoD", idx1
for (idx2 in twoD[idx1]) { # you CANNOT do this with oneD
print "twoD", idx1, idx2, twoD[idx1][idx2]
}
}
}
$ awk -f tst.awk
oneD 1:2 a
oneD 1:3 b
twoD 1
twoD 1 2 c
twoD 1 3 d