我有一个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将其视为两个值的分离。 所以这是我的问题:是否有办法采取“;”作为分隔符而不仅仅是; ?
答案 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"