Сравнивать все остальные столбцы в файле с одним столбцом в другом файле

#awk

#awk

Вопрос:

У меня file1.gz это выглядит так

 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      
  

Мне нужно сравнить $1,$2 плюс каждую букву в каждом другом столбце в 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 и так далее) с $1,$2,$5 file2 приведенным ниже.

 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
  

Если есть совпадение, добавьте « ref «, еще добавьте « dev «. Результат каждого сравнения может быть добавлен к последнему столбцу, как показано в выводе ниже.

     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 
  

Пытался решить в два этапа

Разделение каждого другого столбца

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

А затем пытаюсь адаптировать ответ к аналогичной проблеме, с которой я недавно столкнулся

 | 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 -
  

Он не возвращает никаких выходных данных

Ответ №1:

Вы можете использовать это 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
  

Комментарии:

1. Спасибо! эти дни действительно были для меня почти что awk bootcamp!