2014-09-10 88 views
1

我有一個AWK腳本來將與特定模式匹配的特定值寫入.csv文件。 代碼如下:通過AWK腳本編寫輸出文件時出錯

BEGIN{print "Query Start,Query End, Target Start, Target End,Score, E,P,GC"} 
/^\>g/ { Query=$0 } 
/Query =/{ 
    split($0,a," ") 
    query_start=a[3] 
    query_end=a[5] 
    query_end=gsub(/,/,"",query_end) 
    target_start=a[8] 
    target_end=a[10] 
    } 
    /Score =/{ 
    split($0,a," ") 
    score=a[3] 
    score=gsub(/,/,"",score) 
    e=a[6] 
    e=gsub(/,/,"",e) 
    p=a[9] 
    p=gsub(/,/,"",p) 
    gc=a[12] 

    printf("%s,%s,%s,%s,%s,%s,%s,%s\n",query_start, query_end,target_start,target_end,score,e,p,gc) 
    } 

輸入文件是如下:

100 0 100 172 0 0 0 51 

的:

>gi|ABCDEF| 

Plus strand results: 

Query = 100 - 231, Target = 100 - 172 
Score = 20.92, E = 0.01984, P = 4.309e-08, GC = 51 

但我接收到一個.csv文件低於輸出所提供程序未能複製以下值: 查詢結束 得分 E P (注意:所有失敗值都在逗號(,)前面)

獲得正確輸出的任何幫助都會很好。

最好的問候,

阿米特

+1

爲什麼要根據空間分割,在字段分隔符中使用awk。 – 2014-09-10 12:58:54

+1

**提示:**'gsub'返回所做的替換次數,** ** **修改後的字符串。 – 2014-09-10 13:03:52

+0

**提示2:**'gensub'返回一個修改後的字符串 – 2014-09-10 13:09:18

回答

2

正如@Jidder提到的,你不需要調用分裂()和@jaypal提到你正在使用GSUB()不正確,而且你不如果你只在你的FS中包含,,那麼就需要調用gsub()。

試試這個:

BEGIN { 
    FS = "[[:space:],]+" 
    OFS = "," 
    print "Query Start","Query End","Target Start","Target End","Score","E","P","GC" 
} 
/^\>g/ { Query=$0 } 
/Query =/ { 
    query_start=$4 
    query_end=$6 
    target_start=$9 
    target_end=$11 
} 
/Score =/ { 
    score=$4 
    e=$7 
    p=$10 
    gc=$13 

    print query_start,query_end,target_start,target_end,score,e,p,gc 
} 

這項工作?請注意,字段數字會被忽略,因爲當您不使用默認的FS awk時,不再跳過前導空格,因此在輸入中的空格之前會出現一個空字段。

顯然,您沒有使用您的Query變量,因此填充它的行是多餘的。

+1

而不是在字段分隔符中使用','也可以保留默認值,只需用'+ $ N'來刪除逗號。 – 2014-09-10 13:12:13

+1

+1:這就是餅乾_應該崩潰的方式! – 2014-09-10 13:13:07

+0

@Jidder是的(但是'$ N + 0'爲可移植性),但它稍微更冗長/複雜,我不確定在所有的awk上對於像4.309e-08這樣的值會做什麼,所以我更喜歡只是把它留在輸入中的任何字符串中。 – 2014-09-10 13:17:00