Usar o gensub não substitui a partida

3

Eu tenho um arquivo separado por tabulações e a primeira coluna contém entradas como esta:

sp|O00253|AGRP_HUMAN

Estou tentando usar awk para gerar um novo arquivo contendo apenas o texto entre | s na coluna 1 e o restante do texto inalterado nas colunas restantes.

O regex

/\w{2}\|(\w+)\|\w+/

corresponde ao texto desejado ( O00253 ) no grupo de captura $1 , mas não consigo obter awk para substituir a saída usando gensub .

Eu tentei várias iterações nas linhas abaixo, mas tudo apenas retorna o grupo de captura inalterado.

awk 'gensub(/\w{2}\|(\w+)\|\w+/,"\1","g",$1) {print}'

awk '{print gensub(/\w{2}\|(\w+)\|\w+/,"\1","g",$0)}'

O que estou perdendo?

    
por proteins 11.08.2016 / 18:59

1 resposta

3

Sua segunda solução funciona bem aqui. Seu primeiro não porque gensub

returns the modified string as the result of the function and the original target string is not changed.1

Você pode atribuir o resultado a uma variável e, em seguida, atualizar $1 , por exemplo,

awk '{x=gensub(/\w{2}\|(\w+)\|\w+/,"\1","1",$1);$1=x};1' infile

embora eu faça assim:

awk '{split($1,arr,"|");$1=arr[2]};1' infile
    
por 06.10.2018 / 16:11

Tags