我試圖從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等
我試圖從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等
你不應該在這裏AWK使用。使用Python csv模塊或Perl Text :: CSV或Text :: CSV_XS模塊或其他真正的csv解析器。
相關的問題 - parse csv file using gawk
除非你有使用awk
具體原因,我會建議使用CSV解析庫。許多腳本語言都有一個內置的(或至少可用的),他們可以幫助您避免這些麻煩。
,如果你的第一列的報價始終,
$ 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
情況並非如此,因爲當逗號在空格之後有空格時,它可能沒有第一列中的逗號( – vehomzzz 2010-03-18 13:32:33
如果你無法避免的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] "\"";
}
}
)。例如嘗試這些數據:''sdfsdfsd,sfsdf「,」454,fgdfg「,I_want_this_column' – ghostdog74 2010-03-19 02:18:26
原來的問題表明'FS =」,「',所以我猜空間不是問題。 – 2010-03-19 07:45:47
與所引述的字段用逗號分隔的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
如果你不查看awk,查看我的FOSS CSV流編輯器http://code.google.com/p/csvfix,它允許您通過指定字段索引來提取字段。 – 2010-03-18 13:30:53