我有一个包含许多分隔值的大文本文件。但是文本文件具有由空格和分号分隔的值。下面是使用Less命令在Unix中的某些行的样子:
#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) )。
我该怎么做?
答案 0 :(得分:1)
我不太明白你的意思&#34;相差30或更少&#34;。因为第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()
。