簡體   English   中英

忽略N個匹配項后sed或awk替換

[英]sed or awk replace after ignoring N matches

我有一個重復的文本,我想用另一個標簽仔細地替換另一個標簽,我不介意重復sed awk或另一種方法。 因此,我想先替換前兩個匹配項,然后替換前4、6等。我不需要for ,我只需要下面的代碼,我想跳過前兩個匹配項,然后增加該號碼。

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

這是您要做什么?

$ 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出現在某個地方並且不應更改),我認為它們不會發生,因此我們不需要該腳本,以防止他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM