compara e imprime os valores em dois arrays usando awk

2
A01     11814111        11814112        GA      AA
A01     11485477        11485519        AG      AT
A01     11667935        11667971        TC      TA
A01     11876070        11876079        TC      TG
A01     11613258        11613277        AC      GC
A01     11876079        11876107        CA      GA
A01     11616453        11616463        TA      TG
A01     11875367        11875368        GG      GA
A01     11667971        11667993        CA      AA
A01     11564406        11564411        TA      TG
A01     11477215        11477235        TG      CG

O script awk para dividir os valores das colunas 4 e 5 e, em seguida, testa-os uns contra os outros emparelhados. Quando um valor difere entre as duas matrizes, a cadeia da primeira coluna é impressa com um sublinhado e o valor apropriado da coluna 2 ou 3. Se ambos os nucleotídeos forem diferentes, duas linhas de saída devem ser produzidas. Além disso, imprima os valores diferentes em col 4 e 5 em cada id.

awk '{ split($4, a1, ""); split($5, a2, ""); for (i in a1) { if (a1[i] != a2[i]) print $1 "_" $(i+1) }}' input > out

faz a primeira parte.

saída necessária como:

A01_11814111 G A

A01_11485519 G T
    
por Gavin 30.10.2017 / 21:10

2 respostas

1

Conteúdo de tmp.txt

A01     11814111        11814112        GA      AA
A01     11485477        11485519        AG      AT
A01     11667935        11667971        TC      TA
A01     11876070        11876079        TC      TG
A01     11613258        11613277        AC      GC
A01     11876079        11876107        CA      GA
A01     11616453        11616463        TA      TG
A01     11875367        11875368        GG      GA
A01     11667971        11667993        CA      AA
A01     11564406        11564411        TA      TG
A01     11477215        11477235        TG      CG

Conteúdo de tmp.awk

{
 if (substr($4,1,1) != substr($5,1,1)) {
    print $1 "_" $2 " " substr($4,1,1) " " substr($5,1,1);
 }
 if (substr($4,2,1) != substr($5,2,1)) {
    print $1 "_" $3 " " substr($4,2,1) " " substr($5,2,1);
 }
}

Exemplo de saída

[user@server ~]$ awk -f tmp.awk tmp.txt
A01_11814111 G A
A01_11485519 G T
A01_11667971 C A
A01_11876079 C G
A01_11613258 A G
A01_11876079 C G
A01_11616463 A G
A01_11875368 G A
A01_11667971 C A
A01_11564411 A G
A01_11477215 T C

Bônus. Em bash

#!/bin/bash
while read line
do
   set $line
   if [ ${4:0:1} != ${5:0:1} ]
   then printf "$1_$2 ${4:0:1} ${5:0:1}\n"
   fi
   if [ ${4:1:1} != ${5:1:1} ]
   then printf "$1_$3 ${4:1:1} ${5:1:1}\n"
   fi
done < tmp.txt

Exemplo de saída

A01_11814111 G A
A01_11485519 G T
A01_11667971 C A
A01_11876079 C G
A01_11613258 A G
A01_11876079 C G
A01_11616463 A G
A01_11875368 G A
A01_11667971 C A
A01_11564411 A G
A01_11477215 T C
    
por 30.10.2017 / 22:03
0

solução awk:

awk '{
    split($4$5, arr, "");
    if(arr[1] == arr[3])
        print $1 "_" $3, arr[2], arr[4];
    else
        print $1 "_" $2, arr[1], arr[3];
}' input.txt

solução sed:

sed -r ' 
{
    s@(\w*) *(\w*) *(\w*) *(\w)(\w) *(\w)$@_  @
    s@(\w*) *(\w*) *(\w*) *(\w)(\w) *(\w)$@_  @

}' input.txt

Saída (ambos iguais)

A01_11814111 G A
A01_11485519 G T
A01_11667971 C A
A01_11876079 C G
A01_11613258 A G
A01_11876079 C G
A01_11616463 A G
A01_11875368 G A
A01_11667971 C A
A01_11564411 A G
A01_11477215 T C
    
por 31.10.2017 / 01:55