AWK:如何将文件加载到数组中并将最终结果存储到另一个数组中

时间:2016-06-22 13:44:58

标签: arrays linux shell awk

我有一个input文件,其中包含以下内容

child, parent, val
1  , 0  , a
2  , 1  , b
3  , 1  , c
4  , 2  , d
5  , 2  , e

我需要通过直接读取没有标题的文件将它们存储在名为data_array的数组中。像这样的东西

BEGIN {
while (getline < "input")
{
split($0,ft,",");
child=ft[1];
parent=ft[2];
value=ft[3];
#need help here in assigning two values into the array
data_array[child]=parent,value;
}
close("input");
}

result_array将父级与子级关系与排序保持在一起。

result_array[parent]="all children separated by comma"

例如,父0有一个名为1的子项。父1有两个名为2和3的子项。 2和3的顺序通过按字母顺序排序相应的值来确定。 由于值的排序导致b后跟c,因此数组元素应为2,3。 可能有许多孩子。 无子节点必须使用空白内容编写。 这些结果必须按以下格式进入最终数组。

需要有关此部分的帮助才能将data_array转换为result_array

result_array["0"] = "1"
result_array["1"] = "2,3"
result_array["2"] = "4,5"
result_array["3"] = ""
result_array["4"] = ""
result_array["5"] = ""

如果不清楚,请大声说。

1 个答案:

答案 0 :(得分:3)

使用GNU awk实现真正的多维数组和sorted_in:

$ cat tst.awk
BEGIN { FS=" *, *" }
NR==1 { for (i=1;i<=NF;i++) f[$i]=i; next }
{ parentsChildren2Vals[$(f["parent"])][$(f["child"])] = $(f["val"]) }
END {
    for (parent in parentsChildren2Vals) {
        PROCINFO["sorted_in"] = "@val_str_asc"
        for (child in parentsChildren2Vals[parent]) {
            parents2children[parent] = (parent in parents2children ?
                        parents2children[parent] "," : "") child
            children[child]
        }
    }

    for (child in children) {
        parents2children[child]
    }

    PROCINFO["sorted_in"] = "@ind_num_asc"
    for (parent in parents2children) {
        printf "parents2children[\"%s\"] = \"%s\"\n", parent, parents2children[parent]
    }
}

$ awk -f tst.awk file
parents2children["0"] = "1"
parents2children["1"] = "2,3"
parents2children["2"] = "4,5"
parents2children["3"] = ""
parents2children["4"] = ""
parents2children["5"] = ""