Como adicionar nova coluna, onde o valor é baseado em colunas existentes com o awk

0

Eu tenho um arquivo de várias colunas. Eu gostaria de criar uma coluna adicional com base nos valores de 2 colunas desse arquivo.

Exemplo de entrada:

A B C D E F
1 2 T TACA A 3 2
3 4 I R 8 2
9 3 A C 9 3
  1. Se os valores nas colunas 3 e 4 (identificados como C e D) forem as letras A, C, G ou T, col 7 deverá ser P.
  2. Se as letras nas colunas 3 e 4 forem I, D ou R, a col 7 deverá ser Q.
  3. Se houver várias letras na coluna 3 ou 4, a col 7 deverá ser Q.

Saída desejada:

A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P

Eu tenho o seguinte código, exceto que isso substitui alguns dos valores col 3 por '1'. Eu quero deixar os cols 1-6 inalterados.

awk '{if ((($3!="A" && $3!="C" && $3!="G" && $3!="T") || ($3="I" || $3="D" || $3="R")) || (($4!="A" && $4!="C" && $4!="G" && $4!="T") || ($4="I" || $4="D" || $4="R"))) { $7 = "INDEL" } else { $7 = "SNP" }}1' filename > newfilename
    
por Bob 26.08.2015 / 13:13

2 respostas

2

Isso funciona com mawk :

awk 'NR==1{$7="G";print;next} \
  $3~/^[A,C,G,T]$/ || $4~/^[A,C,G,T]$/ {$7="P"} \
  $3~/^[I,D,R]$/ || $4~/^[I,D,R]$/ {$7="Q"} \
  $4~/[A-Z][A-Z]/ || $3~/[A-Z][A-Z]/ {$7="Q"} 1' file
  1. line: Na primeira linha, escreva o G no cabeçalho.
  2. line: Se $3 de $4 forem A, C, G ou T, então $7 será P .
  3. line: Se $3 de $4 for I, D ou R, então $7 será Q .
  4. linha: Se $3 de $4 for mais de uma carta, $7 será Q . O 1 no final imprime todas as linhas.
por 26.08.2015 / 13:35
0

Este código é auto-explicativo e fácil de entender. Você pode mudar a última condição de acordo com sua exigência ou pode ignorá-la também. Digamos que temos um arquivo de entrada chamado "input_file.txt" e criamos um awk prog em outro arquivo chamado "XXXX.awk". Agora execute-o na linha de comando usando

awk -f XXXX.awk input_file.txt

    BEGIN { 
       FS=" ";
    }
    {
        if(NR==1) print $0" G";
        else if(length($4)>1 || length($3)>1) print $0" Q";
        else if($3 ~ /[I,D,R]/ && $4 ~ /[I,D,R]/) print $0" Q";
        else if($3 ~ /[A,C,G,T]/ && $4 ~ /[A,C,G,T]/) print $0" P";
        else print $0" NA";
    }
    
por 28.10.2017 / 10:25