2016-09-22 18 views
0

ich eine sich wiederholende Text haben, möchte ich mit einem anderen mehrmals ein Etikett sorgfältig ersetzen, I don Geist Methode sedawk oder ein anderer zu wiederholen. Daher würde ich zuerst die ersten beiden Matches ersetzen wollen, dann nach den ersten 4, 6 usw. Ich möchte keinen für, ich brauche nur so etwas wie den Code unten, ich möchte die ersten beiden Matches überspringen und dann erhöhen Sie diese Zahl.sed oder awk ersetzen N nach ignorierend Spiele

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

Hier ist ein Beispiel. Zwei Ereignisse pro Zeile

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 

Wunsch Ausgang

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

Ich habe keine Ahnung, was Sie sagen. Zuerst sagen Sie, dass Sie die ersten zwei Übereinstimmungen ersetzen möchten, dann sagen Sie, dass Sie die ersten zwei Übereinstimmungen überspringen möchten. Welches ist es? Vielleicht zeige Sample-Eingang und die gewünschte Ausgabe. – Barmar

+2

können Sie eine Beispieleingabe/-ausgabe bereitstellen. – zee

+0

Ich habe oben ein Beispiel angegeben. –

Antwort

2

Ist das, was Sie versuchen zu tun?

$ 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 

Angesichts Ihre neue Probe Eingabe/Ausgabe vielleicht ist es das, was Sie wollen:

$ 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 

Da Sie keine regexp Zeichen oder Rückreferenzierung Zeichen oder teilweise Übereinstimmung Fälle in Ihrer Probe Eingabe/Ausgabe beinhalteten (zB wenn das Wort species irgendwo erscheint und NICHT geändert werden sollte) Ich nehme an, dass das nicht passieren kann und deshalb brauchen wir das Skript nicht, um uns davor zu schützen.

+0

ich aktualisiert, Entschuldigung für die Unannehmlichkeiten. –

+0

Kein Problem, ich habe meine Antwort aktualisiert. –