【问题标题】:awk outputting elements out of orderawk输出元素乱序
【发布时间】:2014-03-04 04:45:54
【问题描述】:

在我的 bash 脚本中,我试图用 csv 文件中的元素创建两个并行数组。 csv 文件可以包含 5-40 行。

Array1=($(awk -F, '{a[$1];}END{for (i in a)print i;}' list.csv))
Array2=($(awk -F, '{b[$2];}END{for (i in b)print i;}' list.csv))

然而,在这样做之后,数组中元素的顺序与文件不匹配,它们甚至不匹配。就像 awk 随机获取行一样。为什么会发生这种情况,我该如何解决?谢谢!

【问题讨论】:

    标签: arrays bash csv awk


    【解决方案1】:

    关联数组索引未按顺序排列。您正在看到 awk 的内部索引的效果。

    相反,您可以按您想要的顺序添加它们,然后按该顺序打印它们:

    Array1=($(awk -F, '!a[$1]++ { b[n++]=$1; } END{for (i=0; i<n; i++) print b[i];}' list.csv))
    

    但是,您甚至不需要将它们全部存储起来。如果您只想要每个副本的第一个:

    Array1=($(awk -F, '!a[$1]++ { print $1; }' list.csv))
    

    !a[$1]++ 是一个常见的技巧,当你第一次看到变量时它是正确的(a[$1] 在未设置时被认为是 0。++ 下次增加它。)。

    【讨论】:

      【解决方案2】:
      Array1=($(awk -F, 'BEGIN{i=0;}{a[i++]=$1;}END{for(x=0;x<i;x++) print a[x];}' list.csv))
      Array2=($(awk -F, 'BEGIN{i=0;}{b[i++]=$2;}END{for(x=0;x<i;x++) print b[x];}' list.csv))
      

      在 awk 中您有关联数组,因此当您执行 for in 时,不确定您是否会按照放入它们的顺序获得值。 如果您想让它们排序,请使用计数器作为索引和普通的 for 循环而不是 for in。

      【讨论】:

        【解决方案3】:

        你当然不需要 awk 来完成这个任务:你不必读取文件两次:

        array1=()
        array2=()
        while IFS=, read -r a b; do
            array1+=( "$a" )
            array2+=( "$b" )
        done < list.csv
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-20
          • 2018-11-07
          • 2018-01-10
          • 1970-01-01
          • 2016-02-13
          • 2018-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多