Cómo agregar una cadena a un archivo .txt en todas las filas, excluyendo pocos caracteres usando sed o awk

8

Tengo un archivo de texto llamado 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

Necesito agregar una cadena 'PT_' antes de 'SC48028', 'SC32173' ... etc. La cadena 'SC ...' puede comenzar con cualquier combinación puede ser 'AC ...' o 'DL ..'

Salida requerida:

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

Si ve el resultado anterior, no debemos insertar 'PT_' antes de las cadenas que comienzan con 'i', 'p', 'w' y 'numerical'. He probado algunos comandos básicos para mi requerimiento usando insert / append en sed.

Subrat Sahoo
fuente
2
Su pregunta es sobre el tema y bienvenido aquí, pero podría estar interesado en nuestro nuevo sitio de Bioinformática .
terdon

Respuestas:

13

Con awk :

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

La salida:

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]/ - si el segundo campo comienza con 2 letras mayúsculas

O enfoque de sed :

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt
RomanPerekhrest
fuente
esto fue tan suave, respuesta instantánea muchas gracias. Si quiero agregar en el archivo de entrada existente, ¿qué debo hacer?
Subrat Sahoo
awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txto use mi segundo enfoque
RomanPerekhrest
1
@SubratSahoo Si esta respuesta resuelve su problema, por favor tome un momento y aceptarla haciendo clic en la marca de verificación a la izquierda. Eso marcará la pregunta como respondida y es la forma en que se expresan las gracias en los sitios de Stack Exchange.
terdon
1
Además, @SubratSahoo (y Roman) tienen versiones más nuevas de GNU awk(la que generalmente tiene instalada en los sistemas Linux) -i inplaceque le permite editar un archivo en su lugar, como sed y perl's -i.
terdon
@terdon, sí, lo sé -i inplace(he sugerido un enfoque unificado con mvcomando para que el OP se ajuste a la portabilidad). En cuanto a la Bioinformatics betacomunidad: me acabo de unir. ¿Podría haber tareas relacionadas con la programación / procesamiento de Linux / Python? ¿Cómo crees que?
RomanPerekhrest
6

opción sed

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

dónde

  • -i editar en su lugar
  • -e comando para ejecutar
Archemar
fuente