Comment ajouter une chaîne à un fichier .txt dans toutes les lignes à l'exclusion de quelques caractères à l'aide de sed ou awk

8

J'ai un fichier texte nommé 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

J'ai besoin d'ajouter une chaîne 'PT_' avant 'SC48028', 'SC32173' ... ainsi de suite. La chaîne 'SC ...' peut commencer avec n'importe quelle combinaison peut être 'AC ...' ou 'DL ..'

Sortie requise:

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 vous voyez la sortie ci-dessus, nous ne devons pas insérer «PT_» avant les chaînes qui commencent par «i», «p», «w» et «numérique». J'ai essayé quelques commandes de base pour mes besoins en utilisant insert / append dans sed.

Subrat Sahoo
la source
2
Votre question est sur le sujet et bienvenue ici, mais vous pourriez être intéressé par notre nouveau site de bioinformatique .
terdon

Réponses:

13

Avec awk :

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

Le résultat:

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 le 2ème champ commence par 2 lettres majuscules

Ou approche sed :

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt
RomanPerekhrest
la source
c'était une réponse si douce et instantanée merci beaucoup. Si je veux ajouter dans le fichier d'entrée existant, que faut-il faire?
Subrat Sahoo
awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txtou utiliser ma deuxième approche
RomanPerekhrest
1
@SubratSahoo Si cette réponse a résolu votre problème, veuillez prendre un moment et l' accepter en cliquant sur la coche à gauche. Cela marquera la réponse à la question et c'est ainsi que les remerciements sont exprimés sur les sites Stack Exchange.
terdon
1
En outre, @SubratSahoo (et Roman) des versions plus récentes de GNU awk(celle que vous avez généralement installée sur les systèmes Linux) -i inplacevous permet de modifier un fichier en place, comme sed et perl -i.
terdon
@terdon, oui, je sais -i inplace(j'ai suggéré une approche unifiée avec la mvcommande pour que l'OP s'adapte à la portabilité). Quant à la Bioinformatics betacommunauté: je viens de la rejoindre. Pourrait-il y avoir des tâches liées à la programmation / au traitement Linux / Python? Comment penses-tu?
RomanPerekhrest
6

option sed

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

  • -i éditer sur place
  • -e commande à exécuter
Archemar
la source