2016-11-28 6 views
2

Die sed comandline Skript prepends Text in jeder Zeile in einer Datei:prepend Text zu jedem n-ten Zeile in einer Textdatei

sed -i 's/^/to be prepended/g' text.txt 

Wie kann ich es machen, so dass es nur, dass th auf jedem n tun Linie?

Ich arbeite mit Sequenzdaten und im "norma" multiple fasta-Format gibt es zuerst eine ID-Zeile, die mit einem> beginnt und dann zusätzlichen Text hat.

Die nächste Zeile beginnt mit einer zufälligen DNA-Sequenz wie "AATTGCC" und so weiter, wenn diese Zeichenfolge ihre neue Zeile und neue Kennung ist, wie kann ich Text (zusätzliche Basen) am Anfang der Sequenzzeile voranstellen?

+1

Fasta-Format ist nicht immer alternative Header/Sequenz-Zeilen, Sie sollten sich nicht darauf verlassen! Verwenden Sie einfach die Tatsache, dass nur Kopfzeilen mit '>' beginnen –

Antwort

1
$ seq 10 | perl -pe's/^/to be prepended/unless $. % 3' 
1 
2 
to be prepended 3 
4 
5 
to be prepended 6 
7 
8 
to be prepended 9 
10 
$ seq 10 | perl -pe's/^/to be prepended/unless $. % 3 - 1' 
to be prepended 1 
2 
3 
to be prepended 4 
5 
6 
to be prepended 7 
8 
9 
to be prepended 10 
$ seq 10 | perl -pe's/^/to be prepended/unless $. % 3 - 2' 
1 
to be prepended 2 
3 
4 
to be prepended 5 
6 
7 
to be prepended 8 
9 
10 

Sie haben eine Idee.

4

einfach verwenden, um die folgenden GNU sed Syntax:

sed '0~Ns/^/to be prepended/' 
# ^^^ 
# set N to the number you want! 

beispielsweise prepend HA Zahlen Linien, die Vielfache von 4 sind:

$ seq 10 | sed '0~4s/^/HA/' 
1 
2 
3 
HA4 
5 
6 
7 
HA8 
9 
10 

oder diejenigen, die 4N+1 auf der Form sind:

$ seq 10 | sed '1~4s/^/HA/' 
HA1 
2 
3 
4 
HA5 
6 
7 
8 
HA9 
10 

Von der sed manual → 3.2. Selecting lines with sed:

erster ~ Schritt

Diese GNU-Erweiterung paßt zu jeder stepth Linie beginnend mit Zeile zuerst. Insbesondere werden Zeilen ausgewählt, wenn ein nicht negatives n vorhanden ist, so dass die aktuelle Zeilennummer gleich + (n * Schritt) ist. Um also die ungeradzahligen Zeilen auszuwählen, würde man 1 ~ 2 verwenden; um jede dritte Zeile beginnend mit der zweiten auszuwählen, würde '2 ~ 3' verwendet werden; um jede fünfte Zeile ab dem zehnten zu wählen, benutze '10 ~ 5 '; und '50 ~ 0’ ist nur eine obskure Art zu sagen, 50.

By the way, gibt es keine Notwendigkeit zu verwenden /g für den globalen Austausch, da ^ kann nur einmal in jeder Zeile ersetzt werden.

0
seq 15|awk -v line=4 'NR%line==0{$0="Prepend this text : " $0}1' 
1 
2 
3 
Prepend this text : 4 
5 
6 
7 
Prepend this text : 8 
9 
10 
11 
Prepend this text : 12 
13 
14 
15 
Verwandte Themen