删除grep不匹配的行

时间:2018-02-21 07:20:22

标签: grep file-handling

我有一个包含感兴趣的基因名称(24423个基因)的文件,另一个包含所有基因长度的文件(41306个基因)。我希望长度只能用于24424个基因,但当我grep使用grep -wf file1 file2或甚至fgrep -Fwf file1 file2时,我会得到一些多余的基因,因为我列表中的某些基因可能只包含感觉或反义链,而如果参考文件可能包含两者,那么反映。

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

谢谢。

P.S。问题还出在biostars.org

编辑 -

  

文件1

A1BG

A1BG-AS1

TSPAN6

MYB

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

  

但我总是得到MYB-AS2和MYB-AS3

1 个答案:

答案 0 :(得分:0)

$ 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[$1]; next} $1 in a' f1 f2
A1BG      2941
A1BG-AS1      560
TSPAN6      7923
MYB-AS1      362
  • NR==FNR{a[$1]; next}使用第一个文件中的第一个字段作为键构建一个数组
  • 如果第一个字段是数组中的键,则
  • $1 in a从第二个文件中打印行。整个字段必须匹配
  • 有关此类两种文件处理的更多示例/说明,请参阅http://backreference.org/2010/02/10/idiomatic-awk/