grep 两个文件中 patten 的匹配字段

grep 两个文件中 patten 的匹配字段

是否可以使用 grep 匹配两个不同文件中的字段?例如,如果我有一个 file1.我想匹配两个文件中的字段 POS 如果有 macth 我只输出匹配的行

1   10366   rs58108140  G   A 
1  51954  rs185832753 G C 

文件1

#CHROM  POS ID  REF ALT QUAL
1   10366   rs58108140  G   A   
1   10611   rs189107123 C   G   
1   51954   rs185832753 G   C   
1   13327   rs144762171 G   C   
1   13957   .   TC  T   28  
1   13980   rs151276478 T   C   

文件 2

#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51935   rs181754315 C   T   
1   51954   rs185832753 G   C   
1   52058   rs62637813  G   C   
1   52144   rs190291950 T   A   
1   52238   rs150021059 T   G   
1   54353   rs140052487 C   A

答案1

你不能在 grep 中做到这一点,不。虽然您可以使用带有模式的文件作为 的输入进行搜索grep,但您无法在该文件中指定特定字段。所以如果你只想匹配第二个位置,你需要这样的东西:

$ awk  '{ if(NR==FNR){a[$2]=$0}else{if($2 in a){print}}}' file1.vcf file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

当然,这也会打印位置相同但变异位于另一条染色体上的情况。这就是您的问题所要求的,但寻找 chr 和 pos 的独特组合可能更有意义:

$ awk  '{ if(NR==FNR){a[$1$2]=$0}else{if($1$2 in a){print}}}' file1.vcf file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

要使用 执行此操作grep,您需要首先将 POS 字段提取到新文件中:

awk '{print $2}' file1.vcf > file3
$ cat file3
POS
10366
10611
51954
13327
13957
13980

现在,将此文件与以下内容一起使用grep

$ grep -f file3 file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

但这确实不是一个好主意。例如,它还会找到 1103668 since10366 is a substring of1103668` 的匹配项。


最后,假设这是两个有效的 vcf 文件(您的示例不是),您可以使用bedtools intersect.但这并不是这里的主题。

答案2

使用grep

$ grep -Fof file1 file2
    #CHROM  POS ID  REF ALT QUAL
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   
  • -F使用固定字符串而不是正则表达式
  • -o仅打印匹配
  • -f file1搜索所有模式/固定字符串,每一行一个file1
  • file2在其中搜索这些的文件

替代使用awk

awk '
    NR==FNR{s[$0]=1}
    NR!=FNR && s[$0]
' file1 file2

答案3

如果“匹配”行的任何部分(包括字段之间的空间量)可以在两个文件之间更改,那么这join将是一个更好的工具。

sort -n -k 2 < file1 > sort1
sort -n -k 2 < file2 > sort2
join --header -1 2 -2 2 -o '1.1 1.2 1.3 1.4 1.5'  sort1 sort2

这些sort步骤是必要的,因为join需要对其输入进行排序(在公共字段上)。

结果:

#CHROM POS ID REF ALT
1 10366 rs58108140 G A
1 51954 rs185832753 G C

相关内容