根据公共列匹配和合并两个不同的文件

时间:2014-03-26 15:47:00

标签: regex unix merge match

我正在尝试匹配并从两个文件中提取一些列表。我将通过一个例子更好地解释它。

我有两个文件

List
gene1
gene2
gene3

MainFile
chr17   70593167    70593381    exon    .   +   gene10
chr17   70593167    70593381    intron  .   +   gene1
  1. 我想从MainFile中匹配并提取基因列表。这个的输出将是

    chr17 70593167 70593381 intron . + gene1

  2. 我也希望找到不匹配的。这个的输出将是

    chr17 70593167 70593381 exon . + gene10

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

egrep "$(echo $(<List)|sed 's/ /$|/g')$" MainFile > Matches
egrep -v "$(echo $(<List)|sed 's/ /$|/g')$" MainFile > NonMatches

它在sed和bash替换的帮助下将List转换为正则表达式,然后使用egrep搜索MainFile。

如果List是一个大文件,这可能无法正常工作。

答案 1 :(得分:0)

这个ruby解决方案应该比我的shell版本更快:

#!/usr/bin/ruby

list = File.read("List").split
File.open("Matches","w"){|match|
  File.open("NonMatches","w"){|non|
    File.open("MainFile").each{|line|
      if list.include?(line.split[6])
        match.print(line)
      else
        non.print(line)
      end
    }
  }
}