Несколько входных файлов gziped и несколько if else в awk

#awk

#awk

Вопрос:

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

 NC_044998.1     3756    0       AA
NC_044998.1     3757    0       AA
NC_044998.1     3758    0       AT
NC_044998.1     3759    0       GG
NC_044998.1     3760    0       GG
NC_044998.1     3761    0       GC
NC_044998.1     3763    0       TT
NC_044998.1     3764    0       GG
  

Мне нужно аннотировать file1.gz в соответствии с этим col4 . If col4 — это 2x та же буква (что и в GG ) col5 homozygous , что и «else print « heterozygous «. Вот так:

 NC_044998.1     3756    0       A    A       homozygous
NC_044998.1     3757    0       A    A       homozygous
NC_044998.1     3758    0       A    T       heterozygous
NC_044998.1     3759    0       G    G       homozygous
NC_044998.1     3760    0       G    G       homozygous
NC_044998.1     3761    0       G    C       heterozygous
NC_044998.1     3763    0       T    T       homozygous
NC_044998.1     3764    0       G    G       homozygous
  

Решил это, выполнив (за исключением того, что разбивается col4 на 2).

 gunzip -c file1.gz | awk -v OFS="t" 'sub(/./,"amp;t",$4)1;' | awk -F $'t' 'BEGIN {OFS = FS} {if ($4==$5) print $0,"homozygous"; else print $0,"heterozygous";}' > file1.tmp
  

Затем мне нужно сравнить этот результат с file2.gz приведенным ниже

 chromo  position        major   minor   ref     anc     knownEM nInd
NC_044998.1     3756    A       C       A       A       0.000000        1
NC_044998.1     3757    A       C       T       T       0.000000        1
NC_044998.1     3758    A       C       A       A       0.000000        1
NC_044998.1     3759    G       A       G       G       0.000000        1
NC_044998.1     3760    G       A       G       G       0.000000        1
NC_044998.1     3761    G       A       G       G       0.000000        1
NC_044998.1     3762    A       C       A       A       0.000000        1
NC_044998.1     3764    G       A       C       C       0.000000        1
  

Добавление аннотации, чтобы, если col1, col2, col4 file1.gz == col1, col2, col5 file2.gz я добавлю « ref » в свою аннотацию и col1, col2, col5 file1.gz == col1, col2, col5 file2.gz добавлю « ref «. В противном случае добавьте « dev » в обоих случаях.

таким образом, конечный результат будет:

 NC_044998.1     3756    0       A    A       homozygous    ref    ref
NC_044998.1     3757    0       A    A       homozygous    dev    dev
NC_044998.1     3758    0       A    T       heterozygous  ref    dev
NC_044998.1     3759    0       G    G       homozygous    ref    ref
NC_044998.1     3760    0       G    G       homozygous    ref    ref
NC_044998.1     3761    0       G    C       heterozygous  ref    dev
NC_044998.1     3763    0       T    T       homozygous 
NC_044998.1     3764    0       G    G       homozygous    dev    dev
  

Я знаю, как это сделать отдельно

 gunzip -c  file2.gz | awk -F $'t' 'BEGIN {OFS = FS} NR==FNR{c[$1,$2,$5];next} {if (($1,$2,$4) in c ) print $0,"ref"; else print $0,"dev";}' - file1.tmp > file2.tmp

gunzip -c  file2.gz |awk -F $'t' 'BEGIN {OFS = FS} NR==FNR{c[$1,$2,$5];next} {if (($1,$2,$5) in c ) print $0,"ref"; else print $0,"dev";}' - file2.tmp > output
  

Интересно, как я могу выполнить эти три шага в одном скрипте, возможно, без необходимости создания временных файлов.

Ответ №1:

Вот awk для объединения последних 2 шагов в один:

 awk 'BEGIN {
   FS=OFS="t"
}
FNR==NR {
   a[$1,$2,$5]
   next
}
FNR==1 {
   next
}
{
   print $0, (($1,$2,$4) in a ? "ref":"dev"), (($1,$2,$5) in a ? "ref":"dev")
} file2 file1'
  

кстати, ваш первый сценарий awk также может быть выполнен за один шаг, как это:

 awk 'BEGIN {
   FS=OFS="t"
}
length($NF)==2 {
   p=substr($NF,1,1)
   s=substr($NF,2,1)
   $NF = p OFS s OFS (p==s ? "homozygous" : "heterozygous")
} 1' file
  

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

1. Да, спасибо! Просто давал некоторое время, прежде чем принять ответ, как предлагали мне другие. Теперь все готово. Еще раз спасибо.