Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在linux环境中将一列值与所有列进行比较_Python_Awk_Sed_Bioinformatics_Vcf Variant Call Format - Fatal编程技术网

Python 在linux环境中将一列值与所有列进行比较

Python 在linux环境中将一列值与所有列进行比较,python,awk,sed,bioinformatics,vcf-variant-call-format,Python,Awk,Sed,Bioinformatics,Vcf Variant Call Format,所以我有两个文件,一个VCF看起来像 88 Chr1 25 C - 3 2 1 1 88 Chr1 88 A T 7 2 1 1 88 Chr1 92 A C 16 4 1 1 GENEID Start END GENE_ID 11 155 GENE_ID 165 999 还有一个基因看起来像 88 Chr1 25 C - 3 2 1 1 88 Chr1 88 A

所以我有两个文件,一个VCF看起来像

88  Chr1    25  C   -   3   2   1   1
88  Chr1    88  A   T   7   2   1   1
88  Chr1    92  A   C   16  4   1   1
GENEID  Start END
GENE_ID 11 155
GENE_ID 165 999
还有一个基因看起来像

88  Chr1    25  C   -   3   2   1   1
88  Chr1    88  A   T   7   2   1   1
88  Chr1    92  A   C   16  4   1   1
GENEID  Start END
GENE_ID 11 155
GENE_ID 165 999
我想要一个脚本,看看是否有一个基因位置(VCF文件的第三列)在第二个文件的第二和第三个位置的范围内,然后打印出来

到目前为止,我所做的是加入文件并

awk '{if (3>$12 && $3< $13) print }' > out
awk'{if(3>$12&&3<$13)打印输出
我所做的只是比较联接文件的当前行(仅当值位于同一行时才打印),如何使其比较第3列的所有行与第12列和第13列的所有行

最好的, Serg

我希望能提供帮助(编辑我更改代码以获得更高效的算法)

python中的此算法针对使用字典的非常大的文件进行了优化

limits = [line.strip().split() for line in open("input.genes")]
limits.pop(0) #remove the header
limits = [map(int,v[1:]) for v in limits]

dict_limits = {}
for start, finish in limits:
  for i in xrange(start, finish+1):
    if i not in dict_limits:
      dict_limits[i] = []
    dict_limits[i].append((start,finish))

OUTPUT = open("my_output.txt", "w")
for reg in open("input.vcf"):
  v_reg = reg.strip().split()
  if int(v_reg[2]) in dict_limits:
    OUTPUT.write(reg.strip() + "\tbetween({})\n".format(str(dict_limits[int(v_reg[2])])))

OUTPUT.close()
你会得到:

88  Chr1    25  C   -   3   2   1   1 between(,11-155)
88  Chr1    88  A   T   7   2   1   1 between(,11-155)
88  Chr1    92  A   C   16  4   1   1 between(,11-155)
88 Chr1 25 C - 3 2 1 1 between([(11, 155)]) 88 Chr1 88 A T 7 2 1 1 between([(11, 155)]) 88 Chr1 92 A C 16 4 1 1 between([(11, 155)]) 88 Chr1 25 C-3 2 1介于([(11,155)]) 88 Chr1 88 A T 7 2 1介于([(11155)]之间 88 Chr1 92 A C 16 4 1介于([(11155)]之间
你想在发生这种情况时打印出什么?要将VCF文件中的每一行与gene id文件中的每一行进行比较吗?没有必要为此加入文件(正如您所看到的,这并不能帮助您进行交叉匹配,事实上会使交叉匹配更加困难)。这些文件有多大?他们有几排?一千万?有一个基因文件和一堆VCF文件。基因一号大约有1000行,而VCF有更多。。。从5000到200000,你将被要求在内存中存储基因坐标,然后循环通过VCF,对照每个基因的坐标检查每个变体的位置。这对于awk来说可能会很棘手,但是对于python来说却很简单。当然,这将是低效的,因为您必须对每一条VCF线进行2000次比较。你不能用像床上工具这样的东西来做吗?@heatobrien我刚刚开始处理数据,我以前从未用过床上工具。我现在正在查找它,看看它是否对我有用:)我尝试了它,但没有得到任何输出:/尝试重定向到一个文件,结果是空的。你能解释一下为什么第五行有[NR-1,1]=2美元吗?-1,1在做什么?@srx因为,您的
input.genes
文件有头,我必须删除它(i=1;i@srx是(i=1;a中的i;i++)不起作用,…因为
i在a
中返回
false
如果我保留原始命令,它会显示第11行:对数组a的非法引用。似乎我在这台机器上缺少GNU awk(GAWK),它可以工作!非常感谢您的帮助!