awk if-then-else erro de instrução

1

Estou escrevendo uma instrução if-then-else usando o awk em um script bash.

O que eu gostaria de fazer é identificar linhas com valores de col 1 que não correspondam a uma string específica (rs ou chr) e acrescentar um prefixo (chr) aos valores col 1 dessas linhas identificadas. Todas as linhas com a string combinada devem ser impressas como estavam - sem acrescentar.

Minha linha de código até agora é:

awk '{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}' filename > newfilename

Eu continuo recebendo mensagens de erro de sintaxe com este código.

Eu posso realizar a identificação e anexar com sucesso por conta própria, mas estou tendo problemas em combiná-los em um único comando.

    
por Bob 24.08.2015 / 16:53

2 respostas

3

Aqui está o seu código, expandido para visibilidade:

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            ($1 == "chr"$1);
            print $0}
        };
        else
        { print $0 }
' filename > newfilename

Há vários problemas com isso que vêm à mente

  1. Você está usando uma comparação de igualdade em vez de uma atribuição para tentar adicionar o chr prefix
  2. Você colocou o que deveria ser uma atribuição entre colchetes
  3. Existe um } externo após o primeiro print $0
  4. Não deve haver ponto e vírgula antes da else parte
  5. Você está perdendo o fechamento final } após o código

Aqui está uma versão fixa, ainda expandida:

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr"$1;
            print $0
        }
        else
        { print $0 }
    }
' filename > newfilename

E, em seguida, podemos ver uma otimização simples para mover o print $0 repetido para fora da sua condição:

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr"$1
        }
        print $0
    }
' filename > newfilename

Como isso é basicamente uma simples "condição → alteração", é possível usar a estrutura padrão do awk para simplificar isso ainda mais. Aqui temos duas instruções awk , processadas sequencialmente para cada linha do seu arquivo de entrada. A primeira linha prefixos chr conforme necessário. O segundo imprime todas as linhas.

awk '
    (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr"$1 }
    1
' filename > newfilename
    
por 24.08.2015 / 18:08
1

Usar esta linha parece funcionar perfeitamente:

awk '!($1 ~ /rs/ || /chr/) {$1="chr"$1}1'
    
por 24.08.2015 / 17:15