python - 将一列值与linux环境中的所有列进行比较

标签 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

我想要一个脚本来查看第二个文件的第二个和第三个位置范围内是否存在基因位置(VCF 文件的第 3 列),然后将其打印出来。

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

awk '{if (3>$12 && $3< $13) print }' > out

我所做的只是比较连接文件的当前行(它只在值在同一行时打印),我怎样才能让它比较第 3 列的所有行与第 12 和 13 列的所有行?

最好的, 塞尔格

最佳答案

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

gawk '
  #read input.genes and create list of limits (min, max)
  NR == FNR {
    #without header in input
    if(NR>1) {
      for(i=$2; i<=$3; i++){
        limits[i]=limits[i]","$2"-"$3;
      }
    };
    next
  }
  #read input.vcf, if column 3 is range of limits then print
  {
    if($3 in limits){
      print $0, "between("limits[$3]")"
    }
  }' input.genes input.vcf

你得到:

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)

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)])

关于python - 将一列值与linux环境中的所有列进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30191109/

相关文章:

python - 在wordnet中查找名词的同义词

python - python urlretrieve通过HTTP下载文件的默认路径

javascript - 扩展 Bokeh 以匹配 D3.js

unix - 比较 Unix 脚本中每个单元格的大小

linux - 删除行中的空格和数字,直到行中的第一个字符

Python:在多个进程之间共享一个大型对象字典

linux - 使用通配符搜索并在同一行替换

linux - 使用 sed 或 awk 将某些行中的换行符替换为空格

linux - 从命令行调用 sed 但在脚本中失败

regex - 从两行之间的文件中提取一个 block