
Ich habe einen Datensatz, der so aussieht:
>TRINITY_DN37_c0_g1_i1 len=333 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 len=356 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 len=394 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT
Ich müsste die Zeichenfolge „len=XXX“, die über Tausende von Zeilen hinweg an derselben Position steht, durch eine Zahlenreihe ersetzen, um jede Sequenz eindeutig zu kennzeichnen. Idealerweise dachte ich dabei an etwas wie:
>TRINITY_DN37_c0_g1_i1 1 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 2 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 3 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT
Ich verwende OSX.
Irgendwelche Ideen?
Antwort1
$ cat ip.txt
>TRINITY_DN37_c0_g1_i1 len=333 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 len=356 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 len=394 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT
$ awk '/len=/{sub(/len=[0-9]+/,++c)} 1' ip.txt
>TRINITY_DN37_c0_g1_i1 1 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 2 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 3 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT
/len=/
Zeilen, die diesem Muster entsprechensub(/len=[0-9]+/,++c)
Ersetze das erste Vorkommen deslen=[0-9]+
Musters der übereinstimmenden Zeile durch den erhöhten Wert vonc
(der Standardwert ist0
).
Oder mitperl
perl -i -pe 's/len=\d+/++$c/e' ip.txt
Die -i
Option ist für die Bearbeitung direkt vor Ort.
Antwort2
Eine andere Lösung als die von Sundeep, die einen anderen Awk-Mechanismus verwendet.
awk '
$2 ~ /len=/ { $2=++ctr}
{ print }
' < file
$2 ~ /len=/
stimmt nur mit den Zeilen überein, in denen das zweite Feld enthält len=
, und in diesen Zeilen wird das zweite Feld durch einen Zähler ersetzt.
Anschließend werden alle Zeilen ausgedruckt, unabhängig davon, ob sie der ersten Regel entsprachen oder nicht.
Wenn Sie den Zähler von einem bestimmten Anfangswert aus starten möchten (wenn Ihre Eingabe beispielsweise auf mehrere Dateien verteilt ist), haben Sie folgende Möglichkeiten:
awk '
BEGIN { ctr=12345 }
$2 ~ /len=/ { $2=ctr++ }
{ print }
' < file