Modificar string se o original não corresponder a uma string específica

1

Eu tenho um arquivo com milhões de linhas e quero modificar os valores na coluna A somente se a string for '.'. A modificação seria adicionar "chr:"$2":"$3 ao início da string. Todas as outras linhas seriam impressas como a versão original.

Exemplo de entrada:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
. 3 7654 I R 8

Acima, a quarta linha começa com '.' e precisa ser alterado para "chr3: 7654". Todas as outras linhas precisam permanecer inalteradas.

Saída desejada:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
chr3:7654 3 7654 I R 8 2

Meu código até agora funciona, mas altera TODOS os nomes para iniciar 'chr ...', mesmo quando 'rs ...' deve permanecer inalterado:

awk '($1 ~ /^./) {$1 = "chr:"$2":"$3}1' filename > newfilename

É provavelmente uma solução muito simples, mas está causando problemas muito grandes. Obrigado!

    
por Bob 17.09.2015 / 17:14

1 resposta

3

Seu problema é o regex. /^./ corresponderá a qualquer caractere válido no início da linha. Você deve escapar . para corresponder literalmente:

awk '$1 ~ /^\./ {$1 = "chr:"$2":"$3};1' filename > newfilename

Mas é melhor verificar a string igual em vez de verificar a regex:

awk '$1 == "." {$1 = "chr:"$2":"$3};1' filename > newfilename
    
por 17.09.2015 / 17:21