代码之家  ›  专栏  ›  技术社区  ›  Alexandru Popovici

从AWK构建bash数组

  •  1
  • Alexandru Popovici  · 技术社区  · 6 年前

    我试图构建一个bash数组来保存一系列链接。我使用AWK从links.csv文件[分别是第2列和第4列]获取name和ref属性。CSV文件包含13个链接的信息。

    arrayLinks=($(awk -F, 'NR>2 {printf("\"<a name=%s href=%s target=_blank>\" \n", $2, $4)}' $linksPath))
    

    如果我只运行控制台中的AWK部分,就会得到这样的结果:

    "<a name=name1 href=href1 target=_blank>"
    "<a name=name2 href=href2 target=_blank>"
    "<a name=name3 href=href3 target=_blank>"
    "<a name=name4 href=href4 target=_blank>"
    

    这正是我想要的。但是,如果我在bash脚本中运行代码,而不是得到一个13个元素的数组,那么我得到一个包含更多元素的数组(看起来空间充当了元素分隔符)。

    echo "Number of items in original array: ${#arrayLinks[*]}"
    

    我得到52个结果,而我只期望13个!我做错什么了?

    谢谢您!

    1 回复  |  直到 6 年前
        1
  •  0
  •   chepner    6 年前

    考虑到输出中似乎不太可能有任何换行符,您应该使用 readarray 而不是依靠分词。

    readarray -t arrayLinks < <(
      awk -F, 'NR > 2
               {
                 printf("\"<a name=%s href=%s target=_blank>\" \n", $2, $4)
               }
      ' "$linksPath"
    )
    

    (换行符仅用于可读性;如果愿意,可以将其折叠为一行。)

    问题是,当命令替换被展开时, 每一个 输出中的空白用于将结果拆分为单词。引号只是输出的一部分,而不是保护空白的语法引号。

    这个 读数组 另一方面,命令对数组的每个元素只使用一行输入(不进行分词)。(如果您正在使用 bash 4.4或更高版本,您可以 awk 改为编写以空分隔的输出,并使用 -d 告诉 读数组 如何将其输入拆分为数组元素。)