2013-05-14 48 views
1

我有一個文件(test.bed),看起來像這樣(這可能不是被製表分隔):如何分割AWK場正確

chr1 10002 10116 id=1;frame=0;strand=+; 0 + 
chr1 10116 10122 id=2;frame=0;strand=+; 0 + 
chr1 10122 10128 id=3;frame=0;strand=+; 0 + 
chr1 10128 10134 id=4;frame=0;strand=+; 0 + 
chr1 10134 10140 id=5;frame=0;strand=+; 0 + 
chr1 10140 10146 id=6;frame=0;strand=+; 0 + 
chr1 10146 10182 id=7;frame=0;strand=+; 0 + 
chr1 10182 10188 id=8;frame=0;strand=+; 0 + 
chr1 10188 10194 id=9;frame=0;strand=+; 0 + 
chr1 10194 10200 id=10;frame=0;strand=+; 0 + 

我想產生下面的輸出(這應該是製表分隔):

chr1 10002 10116 id=1 0 + 
chr1 10116 10122 id=2 0 + 
chr1 10122 10128 id=3 0 + 
chr1 10128 10134 id=4 0 + 
chr1 10134 10140 id=5 0 + 
chr1 10140 10146 id=6 0 + 
chr1 10146 10182 id=7 0 + 
chr1 10182 10188 id=8 0 + 
chr1 10188 10194 id=9 0 + 
chr1 10194 10200 id=10 0 + 

我試圖用下面的代碼:

awk 'OFS="\t" split ($0, a, ";"){print a[1],$5,$6}' test.bed 

但後來我得到:

chr1 10002 10116 id=1 40 4+ 
chr1 10116 10122 id=2 40 4+ 
chr1 10122 10128 id=3 40 4+ 
chr1 10128 10134 id=4 40 4+ 
chr1 10134 10140 id=5 40 4+ 
chr1 10140 10146 id=6 40 4+ 
chr1 10146 10182 id=7 40 4+ 
chr1 10182 10188 id=8 40 4+ 
chr1 10188 10194 id=9 40 4+ 
chr1 10194 10200 id=10 40 4+ 

我在做什麼錯?不知何故,數字「4」被添加到最後兩個字段。我認爲數字'4'在某種程度上可能與第4場中的分裂有關,但是,我嘗試生成一個類似的文件,它是第3場被分割,仍然有數字'4'被添加到最後兩個領域。我對'awk'比較陌生,所以我猜這是語法錯誤。任何幫助,將不勝感激。

+1

嘗試'sed的 'S /;幀= 0;鏈= +; //'' – kev 2013-05-14 09:21:55

回答

1

如果您設置字段分隔符爲空白或半支柱,你不會有處理自己分裂:

$ awk '{print $1,$2,$3,$4,$8,$9}' FS='[[:space:]]+|;' OFS='\t' file 
chr1 10002 10116 id=1 0 + 
chr1 10116 10122 id=2 0 + 
chr1 10122 10128 id=3 0 + 
chr1 10128 10134 id=4 0 + 
chr1 10134 10140 id=5 0 + 
chr1 10140 10146 id=6 0 + 
chr1 10146 10182 id=7 0 + 
chr1 10182 10188 id=8 0 + 
chr1 10188 10194 id=9 0 + 
chr1 10194 10200 id=10 0 + 

至於你在做什麼錯:

awk 'OFS="\t" split ($0, a, ";"){print a[1],$5,$6}' 
  • awk的語法是condition{block}並將值設置爲OFS並將i沒有條件。他們是應該在塊內的聲明。
  • 但是,您確實無需在每行上設置OFS的值,因此它只應初始化一次。您可以使用-v選項在BEGIN塊中或在腳本之後執行此操作。

有效的替代品:

$ awk -v OFS='\t' '{split($0,a,";");print a[1],$5,$6}' file 

$ awk 'BEGIN{OFS="\t"}{split($0,a,";");print a[1],$5,$6}' file 

$ awk '{split ($0,a,";");print a[1],$5,$6}' OFS='\t' file 
+0

謝謝你,那不工作。任何想法發生在我的代碼產生數字4? – user53416 2013-05-14 09:22:44

+0

它是分割的返回值。你以不正確的格式寫了awk參數。你所有的操作應該放在'{..}'裏面,我只是像這樣'awk'改變你的awk OFS =「\ t」{split($ 0,a,「;」);打印一個[1],$ 5,$ 6 }''注意''在'split'之前移動,並且它正常工作 – abasu 2013-05-14 09:31:23

+0

謝謝你的解釋,這非常有幫助。然而,我想這不是完全的方式,因爲這只是製表符分隔最後的字段。 – user53416 2013-05-14 09:33:45

1

試試這個:

awk -F\; '{print $1,$4}' test.bed 
+1

這將不允許輸出根據需要分開。 – 2013-05-14 09:24:59

+1

這也適用 - 但我想我將不得不指定輸出,如果輸入不是選項卡分離。 – user53416 2013-05-14 09:27:16