Como substituir a palavra na coluna específica se não corresponder a uma expressão?

1

Eu tenho o seguinte arquivo:

chr1    157784  157887  U6  0   -
chr1    564813  564881  miRNA   0   +
chr1    564879  564950  tRNA    0   -
chr1    564952  565019  tRNA    0   +
chr1    566062  566129  piRNA   0   +
chr1    566137  566205  tRNA    0   -

Se a palavra da expressão na 4ª coluna NÃO começar com "piRNA" OU "miRNA", substitua com a palavra "rfam"

resultado esperado:

chr1    157784  157887  rfam    0   -
chr1    564813  564881  miRNA   0   +
chr1    564879  564950  rfam    0   -
chr1    564952  565019  fram    0   +
chr1    566062  566129  piRNA   0   +
chr1    566137  566205  rfam    0   -

Nota: Haverá muitos nomes diferentes no campo 4, não apenas U6 e tRNA. Esta necessidade de trabalhar para qualquer palavra que não seja piRNA ou miRNA.

    
por Anonymous 29.02.2016 / 01:21

1 resposta

1
awk -v OFS='\t' '$4 !~ /^[pm]iRNA/ { $4 = "rfam" } ; { $4 = $4 ; print }' file

Isso faz exatamente o que você pediu - se o campo 4 não corresponder ao regexp ^[pm]iRNA , defina-o como rfam . Em seguida, imprima a linha se foi alterada ou não.

Nota: configurei o Separador de campo de saída (OFS) como uma guia para garantir uma saída consistente e adicionei $4 = $4 antes da instrução de impressão (que tem o efeito colateral de fazer com que o separador de campo na linha de saída ser alterado para OFS) - caso contrário, as linhas que foram alteradas terão o OFS como padrão (um único espaço), enquanto as linhas inalteradas permanecerão inalteradas em relação ao arquivo original, o que pode fazer com que as colunas não sejam alinhadas corretamente quando vistas com em um terminal com cat ou qualquer outra coisa.

    
por 29.02.2016 / 04:18