将.csv数据解析为矩阵或二维数组bash / shell awk

我有一个逗号分隔的csv文件,名为“ itrs.csv”,我想使用脚本bash或shell将其解析为矩阵或2d数组

Loads\PostDate,schedule,seta,eeta,2019-11-05,2019-11-06,2019-11-07,2019-11-08
BANAMEX,7,1:18:10,1:23:45,G,C,C
EMEA,5,0:21:00,1:01:00,C

我尝试了以下方法:

declare -A matrix
eval matrix=($(awk -f,itrs.csv))
for ((i=0;i<=2;i++))
do
    for ((j=0;j<=$6;j++))
    do
    echo ${matrix[$i,$j]}" " 
    done
    echo
done

,但是上面的代码抛出错误。我还想知道在解析数据时如何检查列数和行数,因为csv文件的大小可能会发生变化。

bjwmkj 回答:将.csv数据解析为矩阵或二维数组bash / shell awk

好吧,您可以执行以下操作:创建一个关联数组,遍历行并保留当前行的计数,然后遍历字段并根据请求创建一个具有索引的关联数组。

i=0
declare -A matrix
while IFS=,read -r -a line; do
   for ((j = 0; j < ${#line[@]}; ++j)); do
        matrix[$i,$j]=${line[$j]}
    done
    ((i++))
done < itrs.csv

declare -p matrix之后将输出:

declare -A matrix=([1,5]="G" [1,4]="G" [1,7]="C" [1,6]="C" [1,1]="7" [1,0]="BANAMEX" [1,3]="1:23:45" [1,2]="1:18:10" [0,4]="2019-11-05" [0,5]="2019-11-06" [0,6]="2019-11-07"[0,7]="2019-11-08" [0,0]="Loads\\PostDate" [0,1]="schedule" [0,2]="seta" [0,3]="eeta" [2,6]="G" [2,7]="C" [2,4]="G"[2,5]="G" [2,2]="0:21:00" [2,3]="1:01:00" [2,0]="EMEA" [2,1]="5" )
  • 请参见bashfaq How can I read a file (data stream,variable) line-by-line (and/or field-by-field)?
  • 请勿使用evaleval是邪恶的。除非您知道自己在做什么,否则不要eval arr=($(..))。在您的情况下,使用eval似乎意义不大甚至为零。
  • 错误来自awkawk的工作方式类似于awk [options] script [file],您可以awk -F,'{print $0}' itrs.csv,但这没有任何意义。 itrs.csvawk解析为脚本-由于它与awk脚本毫无意义,因此该工具会引发错误。
  • 例如,要阅读以逗号分隔成bash数组的仅第一行,您可以IFS=,line=($(head -n1 itrs.csv))-F,影响awk解析文件的方式,而不影响bash创建数组的方式-为此使用IFS
本文链接:https://www.f2er.com/3120620.html

大家都在问