从AWK构建bash数组

时间:2018-08-02 17:58:28

标签: bash awk

我正在尝试构建一个bash数组来容纳一系列链接。我使用AWK从links.csv文件[分别为第2列和第4列]中获取名称和href属性。 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[*]}"

我只得到13个结果,却得到52个结果!我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:0)

鉴于输出中似乎不太可能出现换行符,您应该使用readarray而不是依靠分词。

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

(换行符仅供参考;您可以根据需要将其折叠为一行。)

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

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