删除与 grep 不匹配的行

removing lines that don't match by grep

我有一个文件包含感兴趣的基因名称(24423 个基因),另一个文件包含所有基因的长度(41306 个基因)。我只想要 24424 个基因的长度,但是当我 grep 使用 grep -wf file1 file2 甚至 fgrep -Fwf file1 file2 时,我得到了一些多余的基因,因为我列表中的某些基因可能只包含意义或反义链,而如果参考文件可能同时包含这两种链,那将被反映出来。

我想知道是否有办法从参考文件 (file2) 中删除所有不匹配的行?

谢谢。

P.S。问题也在biostars.org

编辑-

file1

A1BG

A1BG-AS1

TSPAN6

我的

MYB-AS1

file2

A1BG 2941

A1BG-AS1 560

TSPAN6 7923

MYB-AS1 362

MYB-AS2 713

MYB-AS3 396

desired_output

A1BG 2941

A1BG-AS1 560

TSPAN6 7923

MYB-AS1 362

But I always get MYB-AS2 and MYB-AS3

$ cat f1
A1BG
A1BG-AS1
TSPAN6
MYB
MYB-AS1
$ cat f2
A1BG      2941
A1BG-AS1      560
TSPAN6      7923
MYB-AS1      362
MYB-AS2      713
MYB-AS3      396

$ grep -Fwf f1 f2
A1BG      2941
A1BG-AS1      560
TSPAN6      7923
MYB-AS1      362
MYB-AS2      713
MYB-AS3      396

grep 在这里无济于事,因为 MYB 将匹配 MYB-,因为 - 将用作单词边界

改用awk

$ awk 'NR==FNR{a[]; next}  in a' f1 f2
A1BG      2941
A1BG-AS1      560
TSPAN6      7923
MYB-AS1      362
  • NR==FNR{a[]; next} 以第一个文件的第一个字段作为键构建一个数组
  • in a 如果第一个字段是数组中的键,则从第二个文件打印行。整个字段必须匹配
  • 另请参阅 http://backreference.org/2010/02/10/idiomatic-awk/ 了解更多有关此类两个文件处理的信息 examples/explanation