繁体   English   中英

在文件中划分两列并将新列中的输出打印到多个文件的同一文件中

[英]Dividing two columns in a file and printing the output in new column to the same file for multiple files

我有许多VCF格式的文件。这就是它的样子

1   127573  rs7 G   A   79.78   .   AC=1;AF=0.500;AN=2;BaseQRankSum=1.231;ClippingRankSum=-0.358;DB;DP=5;FS=3.979;MLEAC=1;MLEAF=0.500;MQ=60.00;MQ0=0;MQRankSum=0.358;QD=15.96;ReadPosRankSum=1.231  GT:AD:DP:GQ:PL  0/1:2,3:5:27:108,0,27

其中我需要划分最后一列的第二部分,并在新列中打印输出..即,从上面的例子,它的3和5(从第10列0/1:2,3:5:27:108 ,0,27)和它应该看起来的输出,即0.6(即3/5)作为最后一列

 1  127573  rs7 G   A   79.78   .   AC=1;AF=0.500;AN=2;BaseQRankSum=1.231;ClippingRankSum=-0.358;DB;DP=5;FS=3.979;MLEAC=1;MLEAF=0.500;MQ=60.00;MQ0=0;MQRankSum=0.358;QD=15.96;ReadPosRankSum=1.231  GT:AD:DP:GQ:PL  0/1:2,3:5:27:108,0,27 0.6

为了达到这个目的,我在unix中使用了awk,如下所示,

cat result_1 |cut -f10 | sed 's/:/\t/g' >sample
cat sample | cut -f2 | sed 's/,/\t/g' | awk '$2!=0 || $3!=0{print $1"\t"$2"\t"$2/$3}' >result_1 

但它抱怨道

awk: (FILENAME=- FNR=1) fatal: division by zero attempted

Python或Perl中的任何其他替代解决方案都会很棒.. !!!

awk '{split($NF, a, /[,:]/); $(++NF) = a[3]/a[4]; print}' file

好的,除以零:

awk '{split($NF, a, /[,:]/); $(++NF) = (a[4]==0 ? "Inf" : a[3]/a[4]); print}' file

这是一种perl方式:

perl -ne 'chomp;if(/\t[^, ]+,(\d+):0*([1-9]\d*)[\S ]*$/){$n=$1;$d=$2;print("$_\t",$n/$d,"\n")}else{print("$_\t\n")}' < result_1 > result_1.new

这样做。 它将确保匹配中分母的非0正值([1-9] \\ d *),并允许前面带有'0 *'的前导零。

chomp删除硬回车(“\\ n”),因此它在打印中被加上。

它确保您正在解析从最后一个选项卡到字符串末尾的最后一列,并且它允许空格。

-n将代码包装在while(){...}中。

它会添加一个选项卡,即使存在除零,但在这种情况下,将最后一列留空。

如果要覆盖原始文件,可以在之后复制文件,但我更喜欢将前体保存为备份。

在perl中或通过其他语言可能存在更简洁/可读的方式,但这就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM