awk 'NR==1{print $0 " Z";next} {if($6=="NA" || $7=="NA" || $7==0){print $0, "NA"} else {printf "%s %f\n", $0, $6/$7}}' test.txt | column -t > test_Z.txt
计算gwas数据中的Z。当beta或者se为NA或者se为0时,输出NA
输入数据:
CHROM POS SNP A2 A1 beta se pval
1 54676 rs2462492 C T 0.00310951 0.00348526 0.372000051494865
1 55326 rs3107975 T C NA 0.032341 0.966233743154665
1 79137 rs143777184 A T 76554 NA 1.1296208505696
1 86028 rs114608975 T C 0.0022 64434 NA
1 91536 rs1251109649 G T 0.0579919 0.0916 0
1 234313 rs8179466 C T 0.00304548 0.966576 0.357272838151929
1 526736 rs28863004 C G -0.00466575 0.00603352 0.439000484956254
1 533198 rs1557498752 C T NA -0.0116174 0.972317942492195
1 534192 rs6680723 C T 89403 NA 1.02600954251891
1 544584 rs576404767 C T 0.00405 68422 NA
1 546697 rs12025928 A G 0.9914 0.236 0
1 565130 rs371431021 G A 0.0344858 0.215383 0.994763862597434
1 565196 rs139723294 T C 0.00895702 0.00590608 0.129999894541902
1 565469 rs554127336 C T NA -0.00809044 0.956322998061718
输出数据:
CHROM POS SNP A2 A1 beta se pval Z
1 54676 rs2462492 C T 0.00310951 0.00348526 0.372000051494865 0.892189
1 55326 rs3107975 T C NA 0.032341 0.966233743154665 NA
1 79137 rs143777184 A T 76554 NA 1.1296208505696 NA
1 86028 rs114608975 T C 0.0022 64434 NA 0.000000
1 91536 rs1251109649 G T 0.0579919 0.0916 0 0.633099
1 234313 rs8179466 C T 0.00304548 0.966576 0.357272838151929 0.003151
1 526736 rs28863004 C G -0.00466575 0.00603352 0.439000484956254 -0.773305
1 533198 rs1557498752 C T NA -0.0116174 0.972317942492195 NA
1 534192 rs6680723 C T 89403 NA 1.02600954251891 NA
1 544584 rs576404767 C T 0.00405 68422 NA 0.000000
1 546697 rs12025928 A G 0.9914 0.236 0 4.200847
1 565130 rs371431021 G A 0.0344858 0.215383 0.994763862597434 0.160114
1 565196 rs139723294 T C 0.00895702 0.00590608 0.129999894541902 1.516576
1 565469 rs554127336 C T NA -0.00809044 0.956322998061718 NA
这个命令的含义是:读取名为test.txt的文件内容,对每一行进行处理,按照一定的规则生成新的输出,并将结果保存到名为test_Z.txt的文件中。
其中,awk命令由两部分组成,用单引号括起来。第一个部分是对第一行的处理,即在第一行的末尾添加一个名为Z的新列名,然后忽略此行,继续对下一行进行处理。具体来说,NR==1表示当前处理的行号为1,$0表示整行内容," Z"表示要添加的新列名,next表示跳过当前行,继续对下一行进行处理。
第二个部分是对非第一行的处理,即根据条件生成新的输出。具体来说,这个部分使用了一个if语句,判断当前行的第6列(即beta)和第7列(即se)是否为NA或0。如果是,则输出当前行内容和NA;否则,使用printf函数按照一定的格式输出当前行的内容和计算出的Z值(即beta/se),并将结果保存到test_Z.txt文件中。其中,%f表示输出浮点数,\n表示换行符。
最后,这个命令使用了column命令将输出结果格式化为表格形式,以便于查看和分析。">"符号表示将结果输出到test_Z.txt文件中,而不是终端。