2013-03-27 79 views
0

我有几个CSV文件,我从一个在线数据库下载。我试图将它们删减,以便我可以将我需要的数据部分插入到我的SQL数据库中。Bash:如何从CSV文件的列中获取带“分隔符”的列?

的CSV文件逗号分隔的字段,看起来像这样:

1,Peptidoglycan synthetase ftsI,ftsI,1574687,L42023,P45059,FTSI_HAEIN,"",,,, 
3,Histidine decarboxylase,HDC,32109,X54297,P19113,DCHS_HUMAN,,HDC,HDC,HGNC:4855,00817 
5,"Glutaminase liver isoform, mitochondrial",GLS2,6650606,AF110330,Q9UI32,GLSL_HUMAN,,GLS2,GLS2,HGNC:29570,05901 
6,Coagulation factor XIII A chain,F13A1,182309,M22001,P00488,F13A_HUMAN,1FIE,F13A1,F13A1,HGNC:3531,00604 
7,"Nitric oxide synthase, inducible",NOS2,292242,L09210,P35228,NOS2_HUMAN,2NSI,NOS2A,NOS2A,HGNC:7873,01225 

这里是问题。看看第3和第5行。这两行的第二列有逗号!我通常使用awk来完成这样的事情,并且因为那个逗号在那里有2美元会被搞乱。

因此,例如:

awk -F ',' '{print $2}' myfile.csv ## Obviously I will be printing a lot more stuff 

如果做的目的是该部分如上所示,第三和第五线将被拧起来,因为这两条线的第二列具有在其中一个逗号用引号包围分数。

我能做些什么来解决这个问题?

编辑:我想仍然坚持在shell中如果可能的话。

+2

你需要训练的时候分隔符出现在字段来处理CSV格式的工具(如逗号出现在某些字段中)。考虑Perl和[Text :: CSV](http://search.cpan.org/perldoc?Text%3A%3ACSV),或者['csvfix'](http://code.google.com/p/csvfix /)。如果你喜欢Python或Ruby,可能有类似的模块。但是一般来说,从努力使像awk这样的工具用CSV工作来获得的灰色头发是不值得的。 – 2013-03-27 21:23:30

回答

3

你应该使用CSV解析器像Text::CSV(在一个班轮(所以仍然在壳)如果你想),它会做所有的魔法为您服务。

相反,如果你喜欢,看到csv模块

+ 一个例子:

$ python<<EOF 
import csv 

f = open("test.csv", 'rt') 
try: 
    reader = csv.reader(f) 
    for row in reader: 
     print row 
finally: 
    f.close() 
EOF 
+0

我根本不使用Perl(使用Python和shell)。我不需要知道一些Perl来使用它吗? – Joe 2013-03-27 21:28:06

+0

为python添加了链接 – 2013-03-27 21:31:27

+0

顺便提一下,这是相同的链接。 http://docs.python.org/2/library/csv.html我看到了,但我更喜欢坚持在shell中,如果我可以......你认为Text :: CSV会更好吗? – Joe 2013-03-27 21:33:41