awk - 多个 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 col4
is 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
通过这样做解决了这个问题(除了分成col4
2个)。
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 '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
推荐阅读
- javascript - 访问循环javascript之外的变量
- c# - GetAzureADAppOnlyAuthenticatedContext 不释放证书的文件句柄
- c# - 使用 WooCommerceNET 库从 woocomerce 获取数据
- reactjs - 如何使用 React with Firebase 防止具有相同信息的同一用户重复?
- npm - 如何禁止 npm 包执行安装后脚本,而不禁用 package.json 中定义的脚本?
- javascript - console.timeEnd() 的返回值不一致
- vue.js - VueJS中列表的输入
- google-analytics - 使用 cypress 捕获发送到 google-analytics 的数据
- arrays - Google 表格数组中的静态值
- flutter - 在颤动的 Firebase 消息中显示通知徽章