Hinzufügen einer Zeichenfolge zu einer TXT-Datei in allen Zeilen mit Ausnahme weniger Zeichen mit sed oder awk

8

Ich habe eine Textdatei mit dem Namen xid.txt:

xid: SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: SC32173 id: artf398402
xid: SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

Ich muss eine Zeichenfolge 'PT_' vor 'SC48028', 'SC32173' usw. hinzufügen. Die Zeichenfolge 'SC ...' kann mit einer beliebigen Kombination beginnen, z. B. 'AC ...' oder 'DL ..'

Erforderliche Ausgabe:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

Wenn Sie die obige Ausgabe sehen, sollten wir 'PT_' nicht vor Zeichenfolgen einfügen, die mit 'i', 'p', 'w' und 'numerisch' beginnen. Ich habe einige grundlegende Befehle für meine Anforderung mit insert / append in sed ausprobiert.

Subrat Sahoo
quelle
2
Ihre Frage ist thematisch und hier willkommen, aber Sie könnten an unserer neuen Bioinformatik- Website interessiert sein .
Terdon

Antworten:

13

Mit awk :

awk '$2~/^[A-Z][A-Z]/{ $2="PT_"$2 }1' xid.txt

Die Ausgabe:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

  • $2~/^[A-Z][A-Z]/ - wenn das 2. Feld mit 2 Großbuchstaben beginnt

Oder sed Ansatz:

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt
RomanPerekhrest
quelle
Dies war so reibungslos, sofortige Antwort vielen Dank. Was soll getan werden, wenn ich die vorhandene Eingabedatei anhängen möchte?
Subrat Sahoo
awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txtoder benutze meinen zweiten Ansatz
RomanPerekhrest
1
@SubratSahoo Wenn diese Antwort Ihr Problem gelöst hat, nehmen Sie sich bitte einen Moment Zeit und akzeptieren Sie sie, indem Sie auf das Häkchen links klicken. Dadurch wird die Frage als beantwortet markiert und auf die Stack Exchange-Websites wird der Dank ausgesprochen.
Terdon
1
@SubratSahoo (und Roman) neuere Versionen von GNU awk(die Sie normalerweise auf Linux-Systemen installiert haben) -i inplaceermöglichen es Ihnen, eine Datei wie sed und perl zu bearbeiten -i.
Terdon
@terdon, ja, ich weiß über -i inplace(ich habe einen einheitlichen Ansatz mit mvBefehl für das OP vorgeschlagen, um die Portabilität anzupassen). Was die Bioinformatics betaCommunity betrifft: Ich bin gerade beigetreten. Könnte es Aufgaben im Zusammenhang mit der Linux / Python-Programmierung / -Verarbeitung geben? Wie denkst du?
RomanPerekhrest
6

sed Option

sed -i -e 's/[A-Z][A-Z]/PT_&/' file

wo

  • -i an Ort und Stelle bearbeiten
  • -e Befehl zum Ausführen
Archemar
quelle