使用IFS bash进行CSV解析:选择“;”作为分隔符

时间:2013-11-29 11:21:13

标签: bash parsing csv ifs

我有一个130 cols的CSV,我需要做3 csv。 我循环了一段时间和IFS,因为我需要对每一行的变量进行处理。

我在这做了什么:

while IFS=";" read [my 130 vars]
[what i do with the vars] 
done < file.csv

但我在某些行上遇到问题,因为我收到的原始csv就像:

"Hi";"i";"got;a problem"

你可以看到我有一个问题;在一个价值。 IFS将其视为两个值的分离。 所以这是我的问题:是否有办法采取“;”作为分隔符而不仅仅是; ?

2 个答案:

答案 0 :(得分:3)

您可以使用awk

gawk 'BEGIN{FPAT="([^;]+)|(\"[^\"]+\")"}{for(i=1;i<=NF;i++){printf ("%s\n",$i)}}' file.csv

为了您的输入,它会产生:

"Hi"
"i"
"got;a problem"

(我怀疑是否可以使用bash获得所需的结果,即通过操纵IFS。)

答案 1 :(得分:2)

如果你对perl没问题,那么:

# cat version 
"Hi";"i";"got;a problem"

# perl -MText::ParseWords -n -l -e 'print $_ for parse_line(";", 1, $_);' version
"Hi"
"i"
"got;a problem"

我确信应该有办法与awk

实现相同的目标

我可以使用sed

进行管理
# cat version | sed 's/;\("[^"]*"\)*/\n\1/g'
"Hi"
"i"
"got;a problem"