使用awk存储多维数组

时间:2015-02-25 12:01:04

标签: bash unix 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文件,需要进行字段级验证。

3 个答案:

答案 0 :(得分:1)

将文件解析为awk数组:

awk -F \| '{ for(i = 1; i <= NF; ++i) a[NR,i] = $i }' filename

当然,您必须添加使用该数组的代码才能使用该代码。既然你没有说完你想要对阵列做什么(在传递文件之后),这就是我能给你的答案。

答案 1 :(得分:1)

喜欢这个

awk -F'|' '{for(i=1;i<=NF;i++)a[NR,i]=$i} 
           END {print a[1,1],a[2,2]}' file

<强>输出

a r

答案 2 :(得分:1)

你真的想要获得/使用gawk 4. *如果你使用的是多维数组,因为这是唯一支持它们的awk。当你写:

a[1,2]

在任何awk中你实际上是在创建一个psedudo-multi-dimensional数组,这是一个由连接形成的字符串索引的一维数组

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