我有一个大的文本文件,其中包含许多分离的值。但是文本文件的值由空格和分号分隔。下面是Unix中使用Less命令的一些行的外观:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT
chr7 149601 MERGED_DEL_2_39754 T . 141.35 . AC=0;AF=0.00;AN=2;DP=37;MQ=37.00;MQ0=0;1000gALT=<DEL>;AF1000g=0.09
chr7 149616 rs190051229 C . 108.65 . AC=0;AF=0.00;AN=2;DP=35;MQ=37.00;MQ0=0;1000gALT=T;AF1000g=0.00
chr7 149628 rs3814456 A . 129.31 . AC=0;AF=0.00;AN=2;DP=37;MQ=37.00;MQ0=0;1000gALT=G;AF1000g=0.14
chr7 149634 rs146001818 G T 1375.63 . AC=2;AF=1.00;AN=2;BaseQRankSum=0.456;DP=39;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.9997;MQ=37.00;MQ0=0;MQRankSum=1.641;QD=35.27;ReadPosRankSum=1.459;1000gALT=T;AF1000g=0.01
我想用分号代替chr7旁边的空白。然后我想在POS值的某个范围内选择行,例如:149601到149628(前三行),这样我就可以计算出这个范围内AF100g的总值(本例中的前三行是0.24)。在
我该怎么做?在
我不太明白你说的“差30分或更少”是什么意思。因为1号线(149601)和2号线(149616)的差值是15,而这里已经不到30了。在
现在,要获得所需的值(假设您正在迭代该文件并将每一行存储在一个名为
line
的变量中):POS:我建议先用一个空格替换所有空格,然后使用这个空格将字符串分成多个部分(
line = re.sub(r" +", r" ", line)
)。第二个元素就是POS值(pos = int(line.split(" ")[1])
)。在AF值:只需使用正则表达式搜索关键字:
float(re.match(r".*?AF1000g=(.*?)\s.*?", line).groups()[0])
保留一个全局变量,该变量将每个循环步骤中的单独AF值相加。当达到所需条件时,打印相加的AF值。继续将前一个POS值保存在循环外的变量中,并取两个POS值之间的差。如果需要正值,请记住使用
abs()
。在相关问题 更多 >
编程相关推荐