是否可以使用 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 since
10366 is a substring of
1103668` 的匹配项。
最后,假设这是两个有效的 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