2013-03-27 82 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