2

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

4

2 回答 2

3

你可以使用awk

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

对于您的输入,它会产生:

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

(我怀疑是否有可能使用 来达到预期的结果bash,即通过操纵IFS。)

于 2013-11-29T12:01:58.640 回答
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"
于 2013-11-29T11:47:52.510 回答