如何使用 awk 和 bash 初始化数组?

如何使用 awk 和 bash 初始化数组?

我试图将文本文件第一行的值存储到数组中。这是我到目前为止所拥有的:

arr_values=()

awk '
    NR==1 {
            for (i=0; i<=NF; i++)
               'arr_values[i]'=$i            #error here
          }' file.txt

for ((i=0; i<${#arr_values[@]}; i++))
do
   echo ${arr_values[i]}
done

我在初始化数组时遇到错误,主要是因为我不知道如何使用它awk来初始化外部数组。有什么建议(仅限awk)?谢谢。

对于交叉帖子表示歉意,我没有得到我想要的答案。

答案1

如果您解释了上下文,您可能会得到更好的答案为什么 awk...第一行数据是什么样的。

由于您尚未更改字段分隔符,因此我假设您正在处理一行由空格分隔的项目。以下将完全满足您的需求:

arr_values=()

read -ra arr_values <<< $(head -n 1 file.txt)

for s in "${arr_values[@]}"; do
    echo "$s"
done

所有的工作都是在read命令中完成的。除非你需要多次处理数组中的值;然后,你可以简单地执行以下操作:

set -f    # disable globbing, in case the lines contain wildcard characters
for s in $(head -n 1 file.txt); do
    set +f
    echo "$s"
done
set +f

这会将由空格分隔的每个非空白字段条目放入循环中$s并使其通过循环。

答案2

你不能完全按照这种方式来做。您必须让 awk 命令执行,创建一系列由某些分隔符(空格、制表符、NUL 等)分隔的输出值,然后将它们分配给数组元素。原因是 awk 是一个由 shell 运行的程序,它先运行完成任何执行更多 shell 操作。你不能像这样将 shell 内容嵌入到 awk 内容中。

您可以执行如下操作来使用您的简单示例,但我不确定您提供的 awk 代码在任何情况下都能满足您的要求。如果文件有零个记录或多于一个记录,则输出(以及 shell 数组)将包含该文件的行。看起来您希望输出数组包含一组从零到您在文件中找到的字段数的整数,当且仅当它仅包含一个记录时。如果您希望避免数组中出现较大的文件,则必须在 awk 代码中添加第二个无模式操作,其中仅包含“{ }”作为操作,就像我在下面所做的那样。另外,set -f如果该行包含通配符,请关闭文件名通配符扩展 ( ) \[*?

set -f
arr_values=(`awk '
    NR==1 {
            for (i=0; i<=NF; i++)
               print $i
          }

          { }' file.txt`)
set +f
for ((i=0; i<${#arr_values[@]}; i++))
do
   echo "${arr_values[i]}"
done

答案3

如果你想使用awk,你可以这样做:

arr_values=( $(awk '{print;exit}' file) )

shell 将在空白处进行分割。请注意,如果该行包含通配符,它​​们将扩展到匹配文件列表(如果有)。用于set -f禁用通配符扩展。

set -f
arr_values=( $(awk '{print;exit}' file) )
set +f

答案4

我不知道其他的东西,但如果你在空格上分割,这会将文本文件的第一行存储在按空格分割的 shell 数组中:

set -f ; set -- $(head -n1 <textfile) ; set +f

仅此而已。现在您的位置参数是各种数组索引,您的数组是"$@"

相关内容