如何使用awk计算新值并将其存入文件的新列new_MAF?
实现awk添加MAF计算新列的正确脚本
我有一个6列的file.txt文件,内容如下:
CHROM ID REF ALT ALT_FREQS OBS_CT 1 rs376342519:10616:CC:C CC C 0.995708 3862 1 1:54712:T:TTTTC T TTTTC 0.595903 3862 1 rs368808541:603010:C:A C A 0.00194132 3862 1 1:625248:CA:C CA C 0.00326171 3862 1 1:746828:AGG:A AGGATTGCTGAC A 0.00364759 3862 1 1:774926:GAC:G GAC G 0.000900845 3862 1 1:775682:G:A G A 0.00183606 3862 1 rs149821290:781367:A:C A C 0.00493168 3862 1 rs139691522:800053:A:G A G 0.69276305 3862
需求:根据第5列ALT_FREQS的值生成新列new_MAF,规则为:
- 若
ALT_FREQS > 0.5,则new_MAF = 1 - ALT_FREQS - 若
ALT_FREQS ≤ 0.5,则new_MAF = ALT_FREQS
将新列追加到原文件末尾,期望输出如下:
CHROM ID REF ALT ALT_FREQS OBS_CT new_MAF 1 rs376342519:10616:CC:C CC C 0.995708 3862 0.004292 1 1:54712:T:TTTTC T TTTTC 0.595903 3862 0.404097 1 rs368808541:603010:C:A C A 0.00194132 3862 0.00194132 1 1:625248:CA:C CA C 0.00326171 3862 0.00326171 1 1:746828:AGG:A AGGATTGCTGAC A 0.00364759 3862 0.00364759 1 1:774926:GAC:G GAC G 0.000900845 3862 0.000900845 1 1:775682:G:A G A 0.00183606 3862 0.00183606 1 rs149821290:781367:A:C A C 0.00493168 3862 0.00493168 1 rs139691522:800053:A:G A G 0.69276305 3862 0.30723695
当前使用的awk脚本仅能输出计算后的数值,无法合并到原文件:
awk '{if ($5 > 0.5) print 1 - $5 else print $5}' file.txt > newfile.txt
解决方案
修改awk脚本,在打印时保留原行的所有内容,再追加计算后的new_MAF值:
awk 'NR==1{print $0,"new_MAF"; next} {maf = $5 > 0.5 ? 1 - $5 : $5; print $0, maf}' file.txt > newfile.txt
脚本说明
NR==1{print $0,"new_MAF"; next}:处理第一行表头,在原表头后追加new_MAF列名,然后跳过后续逻辑直接处理下一行maf = $5 > 0.5 ? 1 - $5 : $5:使用三元运算符简化条件判断,计算得到new_MAF的值print $0, maf:打印原行所有内容,再追加计算后的maf值,自动用空格分隔列
内容的提问来源于stack exchange,提问作者HKJ3
相关产品推荐
相关产品推荐

