【问题标题】:How to initialize an array using awk and bash?如何使用 awk 和 bash 初始化数组?
【发布时间】:2014-08-13 16:19:01
【问题描述】:

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

arr_values=()

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

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

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

【问题讨论】:

    标签: arrays bash shell awk scripting


    【解决方案1】:

    你可以这样做:

    read -a array <<< $(head -n 1 file)
    
    echo ${array[0]}
    echo ${array[1]}
    

    【讨论】:

    • 我的解决方案有什么区别?期望这里不需要的进程替换。
    • 不,你的管道启动了一个短暂的子shell。
    • 我不确定到底发生了什么,但我知道如果我这样做 command | while read x; do array[0]=x; done 它永远不会作为管道的一部分工作,同样的事情也会发生在这里。
    • 你是对的!这是我的测试有问题。很抱歉造成混乱。
    • 您可以将&lt;&lt;&lt; $(head -n 1 file) 替换为&lt;&lt;&lt; $(awk 'NR==1 {print;exit}' file)。此外,dogbane 的答案可以修改为使用awkarr=($(awk 'NR==1{print;exit}' file))。但是,head 语句在这里是完美的。
    【解决方案2】:

    你可能只是这样做

    read -ra arr_values < file.txt
    

    它只会处理第一行并像awk 一样将其统一分割;将其保存到arr_values。无需使用外部二进制命令进行分叉。

    【讨论】:

    • 为什么是\t? OP 没有指定,默认情况下 awk 在空格上拆分。
    • @dogbane 我不记得了。刚刚测试了一下,发现我错了,所以我在你发表评论前几秒钟进行了编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多