首页 > 解决方案 > 多个 gzip 文件输入和多个 if else 到 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 col4is 2x 相同的字母(如GG)打印col5为“ homozygous”,否则打印“ 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

通过这样做解决了这个问题(除了分成col42个)。

gunzip -c file1.gz | awk -v OFS="\t" 'sub(/./,"&\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

我想知道如何在一个脚本中完成这三个步骤,可能不需要生成临时文件。

标签: awk

解决方案


这是一个将最后两个步骤合并为一个的 awk:

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

推荐阅读