2016-09-22 59 views
0

我有一個重複的文字,我想在其他幾次仔細更換一個標籤,我不介意再說一遍的sedAWK或另一種方法。因此,我想先替換前兩場比賽,然後在第一次4,6等之後,我不想,我只需要類似下面的代碼,我想跳過前兩場比賽,並且然後增加這個數字。SED或忽略ñ後AWK更換匹配

sed 's/foo/bar/2g' fileX 
awk '{ sub(/foo/,"bar"); print }' fileX 

這裏是一個例子。每行

blastx -q specie.fa -db pep -num 6 -max 1 -o 6 > specie.x.outfmt6 
blastp -q specie.pep -db pep -num 6 -max 1 -o 6 > specie.p.outfmt6 
blastx -q specie.fa -db pep -num 6 -max 1 -o 6 > specie.x.outfmt6 
blastp -q specie.pep -db pep -num 6 -max 1 -o 6 > specie.p.outfmt6 

兩次出現所需的輸出

blastx -q dog.fa -db pep -num 6 -max 1 -o 6 > dog.x.outfmt6 
blastp -q dog.pep -db pep -num 6 -max 1 -o 6 > dog.p.outfmt6 
blastx -q worm.fa -db pep -num 6 -max 1 -o 6 > worm.x.outfmt6 
blastp -q worm.pep -db pep -num 6 -max 1 -o 6 > worm.p.outfmt6 
+4

我不知道你在說什麼。首先你說你想替換前兩場比賽,然後你說你想跳過前兩場比賽。這是什麼?也許顯示樣本輸入和所需的輸出。 – Barmar

+2

你能提供一個樣本輸入/輸出。 – zee

+0

我提供了一個上面的例子。 –

回答

2

這是你想要做什麼?

$ awk -v animals='monkey worm dog' 'BEGIN{split(animals,a)} NR%2{c++} {$NF=a[c]} 1' file 
here some text -t monkey 
and then do something -t monkey 
here some text -t worm 
and then do something -t worm 
here some text -t dog 
and then do something -t dog 

鑑於你的新的採樣輸入/輸出,也許這是你想要什麼:

$ awk -v animals='dog worm' 'BEGIN{split(animals,a)} NR%2{c++} {gsub(/specie/,a[c])} 1' file 
blastx -q dog.fa -db pep -num 6 -max 1 -o 6 > dog.x.outfmt6 
blastp -q dog.pep -db pep -num 6 -max 1 -o 6 > dog.p.outfmt6 
blastx -q worm.fa -db pep -num 6 -max 1 -o 6 > worm.x.outfmt6 
blastp -q worm.pep -db pep -num 6 -max 1 -o 6 > worm.p.outfmt6 

既然你沒有包括在你的樣品輸入/輸出任何的正則表達式的字符或向後引用字符或部分匹配的情況下(例如,如果字species出現在某處並且不應該改變),我認爲它們不能發生,所以我們不需要腳本來防範它們。

+0

我更新了,抱歉給您帶來不便。 –

+0

沒問題,我更新了我的答案。 –