我有一个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"] = ""
如果不清楚,请大声说。
答案 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"] = ""