2012-02-15 33 views
0

我有文件,它看起來像這樣:如何用awk命令替換以同一行的第15列開始的行?

>gi|358482566|ref|NW_003766328.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961607, whole genome shotgun sequence 
TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT 
GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT 
ACTAGATTGTA 
>gi|358482565|ref|NW_003766329.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961609, whole genome shotgun sequence 
TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA 
TTTCCATTAGAGGAAAATAAGGTT 

我想要替換所有開始>及其15列線。我不知道如何用列替換該行,所以我試圖用第15列替換該行的所有列。

所以我希望有作爲輸出是:

 >ChrUn_7180000961607 
    TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT 
    GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT 
    ACTAGATTGTA 
    >ChrUn_7180000961609 
    TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA 
    TTTCCATTAGAGGAAAATAAGGTT 

這些都是我的命令:

awk '{if ($1 ~ />/) for (i=1; i<=19; i++) gsub ($i, $15)}' 
test.fa 

當我使用這個我得到的文件中的某些變化,但不是我想要的!列15被刪除!

awk '{if ($1 ~ />/) for (i=1; i<=19; i++) a= $15 gsub($i, a)}' 
gga_ref_Gallus_gallus-4.0_unplaced.fa 

當我使用這一個時,我得到這個錯誤!

awk: (FILENAME=gga_ref_Gallus_gallus-4.0_unplaced.fa FNR=1) fatal: sub_common: buf: can't allocate 521711124992 bytes of memory (Cannot allocate memory) 

所以我想要的是二取代* LL與 * >15列啓動線,我想還是在開始>

+0

你在乎那是第15場的一部分逗號?即使他們是該領域的一部分,您也不會在示例輸出中顯示他們。 – 2012-02-15 15:19:47

+0

這不是管道分離的數據嗎?如果你在談論領域,你需要一個不同的領域分隔符。另外,使用perl這樣做會不會更容易? – tchrist 2012-02-15 15:22:07

+0

@tchrist如果您查看數據,它似乎是以空格分隔的字段;最初我也感到困惑。在awk中看到它是微不足道的,我無法想象在perl中它會變得更容易。 – 2012-02-15 15:30:55

回答

2

我認爲這會做你想要什麼:

awk '$0 ~ /^>/ { print ">" $15; next } 1' 

它的葉子是不>不變開頭的所有行。這是通過使用next來告訴awk跳到>開始的行的情況下的下一個記錄。 1在那裏,因爲它始終爲真,所以打印行的默認行爲是針對任何不以>開頭的行調用的。

+0

你能告訴我什麼劑量1嗎? – mahmood 2012-02-15 15:29:14

+0

@mahmood編輯成答案。如果不夠清楚,請告訴我。 – 2012-02-15 15:33:35

+0

@mahmood而不是'1',你可以有一個規則說'{print}' - 更多的字符,但更清晰。 – 2012-02-15 16:50:03

0

這可能會爲你工作:

sed 's/^\(\s*\)>\(\S*\s*\)\{15\}.*/\1\2/;s/,\s*$//' file