将CSV值保存到shell

时间:2015-07-17 11:30:44

标签: shell csv awk sh

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

我的CSV文件包含多行代码:

 value1;value2;value3
 value4;value5;value6

我有这个:

 for enreg in `cat ../files/inputs/file.csv`
   do
     INFO1= `echo $enreg | awk -F ';' '{ print $1}'`
     INFO2= `echo $enreg | awk -F ';' '{ print $2}'`
     INFO3= `echo $enreg | awk -F ';' '{ print $2}'`
     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的第二行不是计数?

2 个答案:

答案 0 :(得分:0)

如果只使用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提供多个参数,每个; - 分隔的字段将分配给其对应的变量。 1到$f1,第2到$f2,其余到$f3

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

答案 1 :(得分:0)

您可以设置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