2017-12-12 7 views
0

Ich habe eine große Textdatei, die wie folgt aussieht:Buchstaben zum zweiten/dritten/vierten Vorkommen einer Zeichenkette hinzufügen?

1 1:49298 0 49298 T C 
1 1:54676 0 54676 T C 
1 1:54676 0 54676 A G 
1 1:86028 0 86028 C T 
1 1:86028 0 86028 T G 
1 1:86028 0 86028 A G 
1 1:91536 0 91536 T G 

Die zweite Spalte enthält einige Multiples - es gibt definitiv Duplikate und es ist möglich, dass es Triplikaten etc, aber ich habe das nicht vollständig erforscht.

Ich möchte den Buchstaben "b" am Ende des zweiten Vorkommens in Spalte 2 hinzufügen, und "c" zum dritten Vorkommen, "d" zum vierten Vorkommen und so weiter. So sollte die Ausgabedatei wie folgt aussehen:

1 1:49298 0 49298 T C 
1 1:54676 0 54676 T C 
1 1:54676b 0 54676 A G 
1 1:86028 0 86028 C T 
1 1:86028b 0 86028 T G 
1 1:86028c 0 86028 A G 
1 1:91536 0 91536 T G 

Ich dachte, das getan werden könnte, awk, aber ich habe noch keine praktikable Möglichkeiten herausgefunden.

+1

Was haben Sie versucht, und wie ist es gescheitert? Ist Perl eine Option? (Es hat eine praktische Funktion, so dass '$ x =" a "; ++ $ x" ergibt $ x "mit der Zeichenfolge" b ".) – tripleee

+1

Was sollte zum 27. Vorkommen hinzugefügt werden? Wie wäre es mit dem 53.? –

Antwort

3

Dies könnte das sein, was Sie suchen:

$ awk 'cnt[$2]++ { $2=sprintf("%s%c", $2, 96 + cnt[$2]) } 1' file | column -t 
1 1:49298 0 49298 T C 
1 1:54676 0 54676 T C 
1 1:54676b 0 54676 A G 
1 1:86028 0 86028 C T 
1 1:86028b 0 86028 T G 
1 1:86028c 0 86028 A G 
1 1:91536 0 91536 T G 
-1

Und auch dies:

awk '{if ($4 == previous) {i++; print $1, $2sprintf("%c", 97+ i),$3,$4,$5,$6} else {previous = $4; i = 0; print;}}' file 
1 1:49298 0 49298 T C 
1 1:54676 0 54676 T C 
1 1:54676b 0 54676 A G 
1 1:86028 0 86028 C T 
1 1:86028b 0 86028 T G 
1 1:86028c 0 86028 A G 
1 1:91536 0 91536 T G 
+0

Warum wird meine Antwort abgelehnt? –

2

andere awk mit dem Sie die Codes, die Sie

$ awk -v codes="$(echo {b..z})" 'BEGIN{split(codes,s)} 
             {$2=$2 s[c[$2]++]}1' file | column -t 

1 1:49298 0 49298 T C 
1 1:54676 0 54676 T C 
1 1:54676b 0 54676 A G 
1 1:86028 0 86028 C T 
1 1:86028b 0 86028 T G 
1 1:86028c 0 86028 A G 
1 1:91536 0 91536 T G 
1

anhängen steuern lassen Oder perl:

perl -lane ' 
    $F[1] .= chr(96 + $count{$F[1]}) if $count{$F[1]}++ > 0; 
    print join "\t", @F 
' file 
Verwandte Themen