Zahlenreihe an einer bestimmten Position über mehrere Zeilen hinweg

Zahlenreihe an einer bestimmten Position über mehrere Zeilen hinweg

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 entsprechen
  • sub(/len=[0-9]+/,++c)Ersetze das erste Vorkommen des len=[0-9]+Musters der übereinstimmenden Zeile durch den erhöhten Wert von c(der Standardwert ist 0).


Oder mitperl

perl -i -pe 's/len=\d+/++$c/e' ip.txt

Die -iOption 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

verwandte Informationen