array awk usando o número como valor não funcionou

1

Eu tenho um arquivo de referência:

Arquivo de renovação

Dpse\GA30012    FBgn0000447 chr2    26607738    26607962    -1
Dpse\GA19764    FBgn0085819 chrX    28571020    28571736    -1
Dpse\ttk    FBgn0000100 chr2    16553824    16561652    -1
Dpse\GA30195    FBgn0085742 chr3    22629640    22630440    -1

e um arquivo de entrada:

arquivo

FBgn0000447 1   11  HWI-ST1083:68:C0YYUACXX:8:1111:20915:34957  255 -
FBgn0000100 1   11  HWI-ST1083:68:C0YYUACXX:8:1113:9591:98803   255 -
FBgn0085819 1   11  HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
FBgn0085742 1   11  HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
FBgn0037963 47752   47802   HWI-ST1083:68:C0YYUACXX:8:1215:21263:59372  255 -
FBgn0001257 11527   11577   HWI-ST1083:68:C0YYUACXX:8:1311:2957:12154   255 -
FBgn0034315 158 208 HWI-ST1083:68:C0YYUACXX:8:2113:4139:83177   255 -
FBgn0000559 3316    3365    HWI-ST484:183:C167BACXX:7:1101:1926:2031    255 +
FBgn0262975 39033   39082   HWI-ST484:183:C167BACXX:7:1101:1726:2030    255 +
FBgn0032505 1   50  HWI-ST484:183:C167BACXX:7:1101:5095:2042    255 +
FBgn0005593 403 452 HWI-ST484:183:C167BACXX:7:1101:3906:2209    255 +
FBgn0013686 692 741 HWI-ST484:183:C167BACXX:7:1101:3218:2247    255 -
FBgn0000556 3793    3842    HWI-ST484:183:C167BACXX:7:1101:5288:2041    255 +
FBgn0015521 438 487 HWI-ST484:183:C167BACXX:7:1101:5731:2170    255 -
FBgn0033912 1121    1170    HWI-ST484:183:C167BACXX:7:1101:8602:2063    255 -

Eu criei uma coluna vazia entre a primeira e a segunda colunas, o file se tornou esta saída2:

Output2

FBgn0000447     435 485 HWI-ST1083:68:C0YYUACXX:8:1111:20915:34957  255 -
FBgn0000100     704 754 HWI-ST1083:68:C0YYUACXX:8:1113:9591:98803   255 -
FBgn0085819     154 204 HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
FBgn0085742     389 439 HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
FBgn0037963     47752   47802   HWI-ST1083:68:C0YYUACXX:8:1215:21263:59372  255 -
FBgn0001257     11527   11577   HWI-ST1083:68:C0YYUACXX:8:1311:2957:12154   255 -
FBgn0034315     158 208 HWI-ST1083:68:C0YYUACXX:8:2113:4139:83177   255 -
FBgn0000559     3316    3365    HWI-ST484:183:C167BACXX:7:1101:1926:2031    255 +
FBgn0262975     39033   39082   HWI-ST484:183:C167BACXX:7:1101:1726:2030    255 +
FBgn0032505     1   50  HWI-ST484:183:C167BACXX:7:1101:5095:2042    255 +
FBgn0005593     403 452 HWI-ST484:183:C167BACXX:7:1101:3906:2209    255 +
FBgn0013686     692 741 HWI-ST484:183:C167BACXX:7:1101:3218:2247    255 -
FBgn0000556     3793    3842    HWI-ST484:183:C167BACXX:7:1101:5288:2041    255 +
FBgn0015521     438 487 HWI-ST484:183:C167BACXX:7:1101:5731:2170    255 -
FBgn0033912     1121    1170    HWI-ST484:183:C167BACXX:7:1101:8602:2063    255 -

Aqui está a saída ideal:
Para cada ID na coluna 1 no arquivo output2 , para o ID correspondente na coluna 2 no reference file , preencha a coluna output2 do arquivo 2 com o valor da coluna de referência 3. Para cada id na coluna 1 em o arquivo output2 , para o id correspondente na coluna 2 no arquivo de referência, a coluna 3 do arquivo output2 será igual a (coluna 3 + referência 4 - 1) (como resultado do cálculo) e a coluna 4 será igual a (coluna 4 + referência 4 - 1).

Este meu current code e eu não consigo obter o arquivo de saída ideal:

Código atual

awk -v OFS="\t" '
    NR==FNR {a[$2]=$3; b[$2]=$4; next}; 
    {if ($1 in a) $2=a[$1]; print}; 
    {if ($1 in b) $3=b[$1]+$3-1; $4=b[$1]+$4-1; print}
' $ref $output2 > $output3

A saída ideal deve ser semelhante (para as primeiras 4 linhas):

Saída (desejada)

FBgn0000447 chr2 26607738   26607748    HWI-ST1083:68:C0YYUACXX:8:1111:20915:34957  255 -
FBgn0000100 chr2 28571020   28571030    HWI-ST1083:68:C0YYUACXX:8:1113:9591:98803   255 -
FBgn0085819 chrX 16553824   16553834    HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
FBgn0085742 chr3 22629640   22629650    HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -

Não tenho certeza se isso é devido a alguma restrição do valor numérico na matriz awk ou algo está errado. Muito obrigado pela ajuda!

P.S. Lembro-me de um problema, pois reference file nem todos os ids da coluna 2 possuem valores correspondentes na coluna 3/4. Então é por isso que não consigo obter valores em output2 , como devo resolver isso? preencha o que com o espaço vazio é o melhor? Obrigado novamente

    
por Karli 16.12.2014 / 17:00

1 resposta

0

Note que eu usei sua entrada "raw" sem suas modificações de espaço em branco: você não especifica que seu separador de campo de entrada é uma tabulação, então o awk usará "whitespace" como separador de campo importa que você tenha inserido algumas guias extras ou qualquer outra coisa.

awk -v OFS="\t" '
    NR == FNR  {ref3[$2] = $3; ref4[$2] = $4; next}
    $1 in ref3 {
        $3 = $3 + ref4[$1] - 1
        $2 = ref3[$1] OFS ($2 + ref4[$1] - 1)
        print
    }
' reference input
FBgn0000447 chr2    26607738    26607748    HWI-ST1083:68:C0YYUACXX:8:1111:20915:34957  255 -
FBgn0000100 chr2    16553824    16553834    HWI-ST1083:68:C0YYUACXX:8:1113:9591:98803   255 -
FBgn0085819 chrX    28571020    28571030    HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
FBgn0085742 chr3    22629640    22629650    HWI-ST1083:68:C0YYUACXX:8:1204:9035:56108   255 -
    
por 16.12.2014 / 19:13

Tags