unixshell脚本读取csv

unixshell脚本读取csv,unix,awk,Unix,Awk,我有一个csv文件。我想把字段放入不同的变量中。假设csv文件的每行中有三个字段。我有以下代码: csvfile=test.csv while read inline; do var1=`echo $inline | awk -F',' '{print $1}'` var2=`echo $inline | awk -F',' '{print $2}'` var3=`echo $inline | awk -F',' '{print $3}'` . . . don

我有一个csv文件。我想把字段放入不同的变量中。假设csv文件的每行中有三个字段。我有以下代码:

csvfile=test.csv
while read inline; do
   var1=`echo $inline | awk -F',' '{print $1}'`
   var2=`echo $inline | awk -F',' '{print $2}'`
   var3=`echo $inline | awk -F',' '{print $3}'`
   .
   .
   .
done < $csvfile

这可能不是一个完美的解决方案,但它在您的情况下会起作用

[cloudera@quickstart Documents]$ cat cd.csv 
a,b,c
d,"e,f",g
文件内容

csvfile=cd.csv
while read inline; do


var1=`echo $inline | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "*", $i) }1' | awk -F',' '{print $1}' | sed 's/*/,/g'`
var2=`echo $inline | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "*", $i) }1' | awk -F',' '{print $2}' | sed 's/*/,/g'`  
var3=`echo $inline | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "*", $i) }1' | awk -F',' '{print $3}' | sed 's/*/,/g'`


echo  $var1 " " $var2 " " $var3 


done< $csvfile

因此,基本上,我们首先尝试处理数据中的“,”,然后用“*”替换“,”以使用awk获得所需的列,然后再将*还原为“,”以获得实际的字段值,不管怎么说,做你想做的事情的方法是错误的,再加上在不同的变量中保存值几乎肯定是个坏主意。如果您发布简洁、可测试的示例输入和预期输出,我们可以帮助您;除此之外,您还可以使用gawk和
FPAT
:您想对设置的
var
做什么?每行的值都会发生变化,所以我想你应该在循环中对它们做些什么。我在尝试这个脚本时出错了:awk:syntax error靠近第1行awk:bailing out靠近第1行awk:syntax error靠近第1行awk:bailing out靠近第1行awk:bailing out靠近第1行有没有更有效的方法将字段放入变量中?在我的实际csv文件中,每行有15个字段,超过8000行。您可以尝试存储echo$inline | awk-F'''-v OFS=''''''{for(I=2;iHi Pat),如果上面的答案解决了您的问题,请您向上投票并将其标记为答案
csvfile=cd.csv
while read inline; do


var1=`echo $inline | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "*", $i) }1' | awk -F',' '{print $1}' | sed 's/*/,/g'`
var2=`echo $inline | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "*", $i) }1' | awk -F',' '{print $2}' | sed 's/*/,/g'`  
var3=`echo $inline | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "*", $i) }1' | awk -F',' '{print $3}' | sed 's/*/,/g'`


echo  $var1 " " $var2 " " $var3 


done< $csvfile
[cloudera@quickstart Documents]$ sh a.sh 
a   b   c
d   e,f   g