将 CSV 值保存到 shell 中的变量中

Save CSV values into variables in shell

我需要读取 CSV 文件的每一行并将值保存到变量中。

我的多行 CSV 文件示例:

 value1;value2;value3
 value4;value5;value6

我有这个:

 for enreg in `cat ../files/inputs/file.csv`
   do
     INFO1= `echo $enreg | awk -F ';' '{ print }'`
     INFO2= `echo $enreg | awk -F ';' '{ print }'`
     INFO3= `echo $enreg | awk -F ';' '{ print }'`
     echo "INFO1= $INFO1"
     echo "INFO2= $INFO2"
     echo "INFO3= $INFO3"
     echo "$INFO3;$INFO2;$INFO1" >> ../files/output/files.csv
  done

我在控制台中得到以下结果:

 INFO1= value1
 value4
 INFO2= value2
 value5
 INFO3= value3
 value6

但我需要在第二个 CSV 文件中写入:

 INFO1= value1
 INFO2= value2
 INFO3= value3
 INFO1= value4
 INFO2= value5
 INFO3= value6

感谢您的帮助,祝您有愉快的一天。

_______________________________________________________________________________

更新

我的 CSVmatricule.csv 是:

value1;value2;value3 
value4;value5;value6 

我的 CSVmatricule.ks 是:

while IFS=";" read -r f1 f2 f3 
  do 
    echo "INFO1=$f1" 
    echo "INFO2=$f2" 
    echo "INFO3=$f3"
  done < ../files/inputs/CSVmatricule.csv 

我的控制台结果:

INFO1=value1 
INFO2=value2 
INFO3=value3

cat -vet ../files/inputs/CSVmatricule.csv的结果:

value1;value2;value3$
value4;value5;value6

为什么 CSV 的第二行没有被计算在内??

为此使用 awk 命令怎么样?

$ awk -F";" '{for (i=1;i<=NF;i++) printf "INFO%d=%s\n", i, $i}' file
INFO1=value1
INFO2=value2
INFO3=value3
INFO1=value4
INFO2=value5
INFO3=value6

这遍历 ; 分隔的字段并将它们与 INFO + 数字一起打印。

如果字段数固定,也可以使用while循环:

while IFS=";" read -r f1 f2 f3
do
  echo "INFO1=$f1"
  echo "INFO2=$f2"
  echo "INFO3=$f3"
done < file

这是按顺序循环文件的方式,而不是您的 for ... in cat ...。这样,while 中的每个循环都读取一行。此外,通过为 read 提供多个参数,每个 ; 分隔的字段都分配给其对应的变量。第一个到 $f1,第二个到 $f2,其余到 $f3.


如果您需要将这些值存储为变量,只需说:source <( command ).

您可以设置 IFS 变量,以便 read 命令在“;”上拆分:

export IFS=";"
cat ../files/inputs/file.csv | while read INFO1 INFO2 INFO3
 do
   echo "INFO1= $INFO1"
   echo "INFO2= $INFO2"
   echo "INFO3= $INFO3"
   echo "$INFO3;$INFO2;$INFO1" >> ../files/output/files.csv
done