Da Sie speziell nach einer sed-Lösung gefragt haben (ich würde nicht vorschlagen, dies tatsächlich so zu tun - aber Sie könnten):
$ sed = file | sed '1~2 s/^/>seq/'
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Der erste Aufruf sed = file
fügt blanke Zeilennummern ein, der zweite verziert sie, indem die >seq
Zeichenfolge vorangestellt wird .
OTOH Wenn Sie im Voraus wissen, dass es 770 Leitungen gibt, können Sie dies tun
printf ">seq%d\n" {1..770} | sed 'R file'
obwohl dies auf der GNU sed- R
Erweiterung beruht :
R Dateiname
Warteschlange Eine Zeile mit Dateinamen, die am Ende des aktuellen Zyklus oder beim Lesen der nächsten Eingabezeile gelesen und in den Ausgabestream eingefügt werden soll. Beachten Sie, dass, wenn der Dateiname nicht gelesen werden kann oder wenn sein Ende erreicht ist, keine Zeile ohne Fehleranzeige angehängt wird.
Natürlich , wenn Sie nicht die Anzahl der Zeilen im Voraus wissen, Sie könnten tun
printf ">seq%d\n" $(seq 1 "$(wc -l < file)") | sed 'R file'
Dies würde jedoch den Vorteil verlieren, dass die Datei nur einmal gelesen werden muss.
In der Praxis würde ich wahrscheinlich die awk-Lösung von @ John1024 oder deren Perl-Äquivalent verwenden
perl -lpe 'print ">seq" . $.' file
Ihre Aufgabe kann mit sed erledigt werden, aber sed fehlt jedes native Verständnis der Arithmetik, was es zum falschen Werkzeug macht. Awk funktioniert gut:
Wie es funktioniert:
print ">seq" NR
Für jede neue gelesene Zeile drucken wir zuerst die gewünschte Kopfzeile.
NR
ist awks Zeilenzähler.1
Dies ist die kryptische Abkürzung von awk für Print-the-Line.
quelle
awk
ein viel geeigneteres Werkzeug ist. Ein weiteres Beispiel dafür, dass es wichtig ist zu verstehen, was der Kunde braucht - nicht einfach das zu tun, was er verlangt (siehe das berühmte Ford-Zitat "Wenn ich meine Kunden fragen würde, was sie wollen, würden sie" ein schnelleres Pferd "sagen."){ printf(">seq%d\n%s\n", NR, $0) }
.Verwenden einer einfachen Schleife:
Die Ausgabe:
quelle
printf
;)Verwenden von
paste
:seq -f '>seq%g' 1 4
schreibt durch Zeilenumbrüche getrennte Zahlen in stdoutpaste
Verkettet die entsprechende Zeile jeder Datei, getrennt durch ein Trennzeichen-d '\n'
Setzt den Verkettungsbegrenzer auf eine neue Zeile anstelle der Standardregisterkartequelle
1 4
imseq
Befehl erklären ?seq -f '>seq%g' 1 4 | paste -d '\n' - file