将 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
我需要读取 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