Come aggiungere una stringa a un file .txt in tutte le righe escludendo pochi caratteri usando sed o awk


8

Ho un file di testo chiamato 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

Ho bisogno di aggiungere una stringa "PT_" prima di "SC48028", "SC32173" ... e così via. La stringa 'SC ...' può iniziare con qualsiasi combinazione può essere 'AC ...' o 'DL ..'

Uscita richiesta:

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

Se vedi l'output sopra, non dovremmo inserire "PT_" prima delle stringhe che iniziano con "i", "p", "w" e "numerico". Ho provato alcuni comandi di base per il mio requisito usando insert / append in sed.


2
La tua domanda è sull'argomento e benvenuta qui, ma potresti essere interessato al nostro nuovo sito di Bioinformatica .
terdon

Risposte:


13

Con awk :

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

Il risultato:

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]/ - se il 2 ° campo inizia con 2 lettere maiuscole

O approccio sed :

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt

questa è stata una risposta così fluida e immediata grazie mille. Se voglio aggiungere nel file di input esistente cosa devo fare?
Sottotitoli Sahoo il

awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txtoppure usa il mio secondo approccio
RomanPerekhrest,

1
@SubratSahoo Se questa risposta ha risolto il problema, prenditi un momento e accettalo facendo clic sul segno di spunta a sinistra. Questo segnerà la domanda come risposta ed è il modo in cui i ringraziamenti sono espressi sui siti di Stack Exchange.
terdon

1
Inoltre, @SubratSahoo (e Roman) versioni più recenti di GNU awk(quella che di solito hai installato su sistemi Linux) ha -i inplaceche ti permette di modificare un file in atto, come sed e perl's -i.
terdon

@terdon, sì, lo so -i inplace(ho suggerito un approccio unificato con mvcomando affinché l'OP si adattasse alla portabilità). Per quanto riguarda la Bioinformatics betacomunità: mi sono appena iscritto. Potrebbero esserci compiti relativi alla programmazione / elaborazione Linux / Python? Come pensi?
RomanPerekhrest,

6

opzione sed

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

dove

  • -i modifica sul posto
  • -e comando da eseguire
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.