Como adicionar uma seqüência de caracteres a um arquivo .txt em todas as linhas, exceto alguns caracteres usando sed ou awk

8

Eu tenho um arquivo de texto chamado 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

Preciso adicionar uma string 'PT_' antes de 'SC48028', 'SC32173' ... etc. A cadeia 'SC ...' pode começar com qualquer combinação, pode ser 'AC ...' ou 'DL ..'

Saída necessária:

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 você vir a saída acima, não devemos inserir 'PT_' antes das strings que começam com 'i', 'p', 'w' e 'numérico'. Eu tentei alguns comandos básicos para o meu requisito usando insert / append no sed.

Subrat Sahoo
fonte
2
Sua pergunta está relacionada ao tópico e seja bem-vinda aqui, mas você pode estar interessado em nosso novo site de Bioinformática .
terdon

Respostas:

13

Com awk :

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

A saída:

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 o segundo campo começar com 2 letras maiúsculas

Ou abordagem sed :

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt
RomanPerekhrest
fonte
isso foi tão suave, resposta instantânea muito obrigado. Se eu quiser acrescentar no arquivo de entrada existente, o que deve ser feito?
Subrat Sahoo
awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txtou use minha segunda abordagem
RomanPerekhrest
1
@SubratSahoo Se esta resposta resolveu seu problema, reserve um momento e aceite-o clicando na marca de seleção à esquerda. Isso marcará a pergunta como respondida e é assim que os agradecimentos são expressos nos sites do Stack Exchange.
terdon
1
Além disso, as versões mais recentes do @SubratSahoo (e Roman) do GNU awk(a que você normalmente instala nos sistemas Linux) possuem, o -i inplaceque permite editar um arquivo no local, como sed e perl -i.
terdon
@terdon, sim, eu sei -i inplace(sugeri uma abordagem unificada com mvcomando para o OP caber na portabilidade). Quanto à Bioinformatics betacomunidade: eu acabei de participar. Poderia haver tarefas relacionadas à programação / processamento do Linux / Python? Como você pensa?
RomanPerekhrest
6

opção sed

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

Onde

  • -i editar no local
  • -e comando para executar
Archemar
fonte