Compare every other column in a file to one column in another file

Viewed 49

I have file1.gz That looks like

NC_044998.1     4013    0       TT      2       GG      0       TT      0       TT      0       TT      
NC_044998.1     4016    0       TT      0       TT      0       TT      2       GG      0       TT      
NC_044998.1     4017    0       TT      0       TT      0       TT      0       TT      0       TT      
NC_044998.1     4018    0       TT      0       TA      0       TT      0       TT      0       TT      
NC_044998.1     4019    2       CC      2       CC      2       CC      2       CC      2       CC      

I need to compare $1,$2, plus every letter in every other column in file1 ($1,$2,letter 1 of $4, then $1,$2, letter 2 of $4, then $1,$2,letter 1 of $6, then $1,$2,letter 2 of $6, and so on) to $1,$2,$5 of file2 bellow.

chromo  position        major   minor   ref     anc     knownEM nInd
NC_044998.1     4013    T       G       T       T       0.000000        1
NC_044998.1     4016    G       T       G       G       0.000000        1
NC_044998.1     4018    T       A       T       T       0.000000        1
NC_044998.1     4019    G       A       G       G       0.000000        1
NC_044998.1     3760    G       A       G       G       0.000000        1

If there's a match add "ref" else add "dev". The result of each comparison can be appended to the last column, as in the output bellow.

    NC_044998.1     4013    0       TT      2       GG      0       TT      0       TT      0       TT  ref ref dev dev ref ref ref ref ref ref  
    NC_044998.1     4016    0       TT      0       TT      0       TT      2       GG      0       TT  dev dev dev dev dev dev ref ref dev dev        
    NC_044998.1     4017    0       TT      0       TT      0       TT      0       TT      0       TT      
    NC_044998.1     4018    0       TT      0       TA      0       TT      0       TT      0       TT  ref ref ref dev ref ref ref ref ref ref     
    NC_044998.1     4019    2       CC      2       CC      2       CC      2       CC      2       CC  dev dev dev dev dev dev dev dev dev dev 

Tried to solve in two steps

Splitting every other column

awk 'BEGIN {FS = OFS = "\t"} {for (i=4; i<=12; i+=2) {sub(/./,"&\t",$i)1;} print $0};' file1

And then trying to adapt an answer to a similar problem I had recently

| awk 'BEGIN {FS=OFS="\t"} FNR==NR {a[$1,$2,$5]; next} FNR==1 { next } {for (i=4; i<=12; i+=3) {print $0, (($1,$2,$4) in a ? "ref":"dev"), (($1,$2,$i + 1 ) in a ? "ref":"dev")}}' file2 -

It doesn't return any output

1 Answers

You may use this awk:

awk 'BEGIN {
   FS=OFS="\t"
}
FNR == NR {
   map[$1,$2] = $5
   next
}
($1,$2) in map {
   for (i=4; i<=NF; i+=2)
      for (j=1; j<=2; ++j)
         $0 = $0 " " (substr($i,j,1) == map[$1,$2] ? "ref" : "dev")
} 1' file2 file1
NC_044998.1 4013    0   TT  2   GG  0   TT  0   TT  0   TT ref ref dev dev ref ref ref ref ref ref
NC_044998.1 4016    0   TT  0   TT  0   TT  2   GG  0   TT dev dev dev dev dev dev ref ref dev dev
NC_044998.1 4017    0   TT  0   TT  0   TT  0   TT  0   TT
NC_044998.1 4018    0   TT  0   TA  0   TT  0   TT  0   TT ref ref ref dev ref ref ref ref ref ref
NC_044998.1 4019    2   CC  2   CC  2   CC  2   CC  2   CC dev dev dev dev dev dev dev dev dev dev
Related