use sed ou awk para remover uma string de uma coluna específica, onde o início e o fim da string são conhecidos

0

meu arquivo contém linhas como esta:

1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

Eu gostaria de remover tudo da coluna 4, começando com POS e terminando. GINFO =

Acho que isso pode funcionar: sed -e 's/POS=.*;GINFO=//‘ file > new_file

Se estiver tudo bem, como direcioná-lo para a coluna 4 especificamente?

    
por Gordon Daly 30.04.2018 / 11:24

3 respostas

0

Para abordar a quarta coluna, use diretamente o seguinte awk approarch:

awk '{ sub(/^POS.*GINFO=/, "", $4) }1' file > new_file
  • $4 - aponta para o quarto campo
  • sub(/^POS.*GINFO=/, "", $4) - substitui uma substring dada pelo padrão /^POS.*GINFO= dentro do quarto campo
por 30.04.2018 / 11:49
0

Se as colunas que você quer dizer e conhecidas forem separadas por espaço, você poderá fazer o seguinte:

sed -E 's/^(([^ ]* ){3})POS=.*;GINFO=//' infile

Este ^(([^ ]* ){3}) corresponde a partir do início da linha ^ para qualquer coisa * não é um espaço [^ ] até que um primeiro espaço seja visto e repita isso para o máximo {3} times; Os parênteses fazem essa correspondência como uma correspondência de agrupamento com referência de , que depois a revertemos na peça de reposição s/pattern/replace/ .

Esse (...)POS=.*;GINFO= também corresponde a POS= seguido por qualquer coisa .* till ;GINFO visto e será removido da saída.

Para os dados de amostra abaixo indicados:

1 10241 POS=rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

Irá retornar um resultado:

1 10241 POS=rs960927773 DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 DDX11L1:100287102;R5;ASP

A versão POSIXly poderia ser:

sed 's/^\([^ ]* \)\([^ ]* \)\([^ ]* \)POS=.*;GINFO=//' infile
    
por 30.04.2018 / 13:56
0

No POSIXly sed, podemos fazer assim:

sed -ne '
   #place a markholder at the beginning of the 4th field
   s/[^[:blank:]][[:blank:]]\{1,\}/&\
/3

   # perform the sub on the 4th field
   s/\nPOS=.*;GINFO=//p
'  input_file
    
por 02.05.2018 / 09:57