【问题标题】:AWK: How to load a file into array and store the final results into another arrayAWK:如何将文件加载到数组中并将最终结果存储到另一个数组中
【发布时间】:2016-10-24 12:14:15
【问题描述】:

我有一个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"] = ""

如果不清楚请大喊。

【问题讨论】:

  • 你可以使用NR &gt; 1跳过第一行,但是这里的data_array似乎是一个映射而不是一个数组
  • 如果您曾经考虑使用getline,请确保您首先阅读并完全理解awk.freeshell.org/AllAboutGetline,以了解何时以及如何使用它。 edit 您的问题包括简洁、可测试的样本输入和预期输出,以便我们可以帮助您以正确的方式做任何事情。
  • @EdMorton 我的经验告诉我 awk.getline 非常棘手......我也在你的一个 cmets 中找到了链接的文档。这是必读的 getline 指南。现在我只在必要时才选择 getline..

标签: arrays linux shell awk


【解决方案1】:

使用 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"] = ""

【讨论】:

  • 错误awk: tst.awk:3: { parentsChildren2Vals[$(f["par"])][$(f["Chl"])] = $(f["val"]) } awk: tst.awk:3: ^ syntax error awk: tst.awk:3: { parentsChildren2Vals[$(f["par"])][$(f["Chl"])] = $(f["val"]) } awk: tst.awk:3: ^ syntax error awk: tst.awk:7: for (child in parentsChildren2Vals[parent]) { awk: tst.awk:7: ^ syntax error
  • 那么你复制/粘贴错误或者你没有使用 GNU awk 4.* 来处理真正的多维数组。如果是后者(awk --version),就搞定。
  • 是的,我的是GNU Awk 3.1.5
  • 这是一个史前傻瓜,缺少大量非常有用的功能(请参阅gnu.org/software/gawk/manual/gawk.html#Feature-History)。获取更新版本。
  • 明白。完美的。我错误地交换了列。现在一切都清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2017-10-18
相关资源
最近更新 更多