2010-03-18 61 views
1

我試圖從csv文件第4列(以逗號分隔,並跳過第2個標題行)使用此命令,用逗號解析問題分開csv文件

awk 'NR <2 {next}{FS =","}{print $4}' filename.csv | more 

但是,它並沒有因爲工作第一列是逗號,因此第四列並不是第4列。下面是一排的一個例子:

「sdfsdfsd,sfsdf」,454,fgdfg,I_want_this_column,sdfgdg,34546,456465等

+0

如果你不查看awk,查看我的FOSS CSV流編輯器http://code.google.com/p/csvfix,它允許您通過指定字段索引來提取字段。 – 2010-03-18 13:30:53

回答

0

你不應該在這裏AWK使用。使用Python csv模塊或Perl Text :: CSV或Text :: CSV_XS模塊或其他真正的csv解析器。

相關的問題 - parse csv file using gawk

3

除非你有使用awk具體原因,我會建議使用CSV解析庫。許多腳本語言都有一個內置的(或至少可用的),他們可以幫助您避免這些麻煩。

1

,如果你的第一列的報價始終,

$ awk 'BEGIN{ FS="\042[ ]*," } { m=split($2,a,","); print a[3] } ' file 
I_want_this_column 

,如果你想列總是最後2,

$ awk -F"," '{print $(NF-1)}' file 
I_want_this_column 

你可以試試這個演示腳本打破列

awk 'BEGIN{ FS="," } 
{ 
    for(i=1;i<=NF;i++){ 
     # save normal 
     if($i !~ /^[ ]*\042|[ ]*\042[ ]*$/){ 
     a[++j]=$i 
     } 
     # if quotes at the end 
     if(f==1 && $i ~ /[ ]*\042[ ]*$/){ 
     s=s","$i 
     a[++j]=s 
     #reset 
     s="";f=0 
     } 
     # if quotes in front 
     if($i ~ /^[ ]*\042/){ 
     s=s $i 
     f=1 
     } 
     if(f==1 && ($i !~/\042/)){ 
     s=s","$i 
     } 
    } 
} 
END{ 
    # print columns 
    for(p=1;p<=j;p++){ 
    print "Field "p,": "a[p] 
    } 
} ' file 

輸出

$ cat file 
"sdfsdfsd, sfsdf", "454,fgdfg blah , words ", I_want_this_column,sdfgdg 

$ ./shell.sh 
Field 1 : "sdfsdfsd, sfsdf" 
Field 2 : fgdfg blah 
Field 3 : "454,fgdfg blah , words " 
Field 4 : I_want_this_column 
Field 5 : sdfgdg 
+0

情況並非如此,因爲當逗號在空格之後有空格時,它可能沒有第一列中的逗號( – vehomzzz 2010-03-18 13:32:33

0

如果你無法避免的awk,這段代碼就你所需要的工作:

BEGIN {FS=",";} 

{ 
     f=0; 
     j=0; 
     for (i = 1; i <=NF ; ++i) { 
       if (f) { 
         a[j] = a[j] "," $(i); 
         if ($(i) ~ "\"$") { 
           f = 0; 
         } 
       } 
       else { 
         ++j; 
         a[j] = $(i); 
         if ((a[j] ~ "^\"[^\"]*$")) { 
           f = 1; 
         } 
       } 
     } 
     for (i = 1; i <= j; ++i) { 
       gsub("^\"","",a[i]); 
       gsub("\"$","",a[i]); 
       gsub("\"\"","\"",a[i]); 
print "i = \"" a[i] "\""; 
     } 
} 
+0

)。例如嘗試這些數據:''sdfsdfsd,sfsdf「,」454,fgdfg「,I_want_this_column' – ghostdog74 2010-03-19 02:18:26

+0

原來的問題表明'FS =」,「',所以我猜空間不是問題。 – 2010-03-19 07:45:47

0

與所引述的字段用逗號分隔的CSV文件內的工作可能很難與標準UNIX文本工具。

我寫了一個名爲csvquote的程序,使數據易於處理。在你的情況,你可以使用這樣的:

csvquote filename.csv | awk 'NR <2 {next}{FS =","}{print $4}' | csvquote -u | more 

或者你可以使用切割和尾巴像這樣:

csvquote filename.csv | tail -n +3 | cut -d, -f4 | csvquote -u | more 

的代碼和文檔是在這裏:https://github.com/dbro/csvquote