![](/img/trans.png)
[英]Comparing multiple columns of two csv files and save output as matching/not matching in new csv file
[英]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.