如何在一个文件中查找与另一个文件匹配的条目

时间:2018-04-25 04:59:37

标签: awk grep

我有一个文件(file1),其中包含以下内容:

ENST00000364447.1   116 16.000  0.000000    0.000000
ENST00000364424.1   107 17.000  0.000000    0.000000
ENST00000364180.1   107 17.000  0.000000    0.000000
ENST00000384451.1   107 17.000  0.000000    0.000000
ENST00000362957.1   109 17.000  0.000000    0.000000
ENST00000362478.1   107 17.000  0.000000    0.000000
ENST00000384227.1   107 17.000  0.000000    0.000000
ENST00000365615.1   107 17.000  0.000000    0.000000
ENST00000517091.1   106 17.000  0.000000    0.000000

我需要在此文件的第1列中找到与另一个文件(file2)的第10列中的文本匹配的条目:

chr1    HAVANA  gene    29554   31109   .   +   .   gene_id "ENSG00000243485.5"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; level 2; tag "ncRNA_host"; havana_gene "OTTHUMG00000000959.2";
chr1    HAVANA  transcript  29554   31097   .   +   .   gene_id "ENSG00000243485.5"; transcript_id "ENST00000473358.1"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; transcript_type "lincRNA"; transcript_name "RP11-34P13.3-001"; level 2; transcript_support_level "5"; tag "not_best_in_genome_evidence"; tag "dotter_confirmed"; tag "basic"; havana_gene "OTTHUMG00000000959.2"; havana_transcript "OTTHUMT00000002840.1";

在第10栏中,名称位于“”。

我尝试了grep -F -f file1 file2 > file3,但速度非常慢。我也尝试了一些不同的awk,但我似乎无法正确使用语法。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

纯粹的awk:

awk 'FNR==NR{gsub(/[";]/,"",$10);F[$10];next}( $1 in F )' FilterFile2 DataFile1

如果性能和尺寸很大(> 10000过滤器),则可以选择

awk '{gsub(/[";]/,"",$10);print "^" $10 "[[:blank:]]"}' FilterFile2 > CleanFilter 
grep -E -f  CleanFilter DataFile1

答案 1 :(得分:0)

试试这个:

cut -d \" -f 2 < file2 | grep -f - file1

说明:

cut -d \" -f 2 < file2

将转换

chr1    HAVANA  gene    29554   31109   .   +   .   gene_id "ENSG00000243485.5"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; level 2; tag "ncRNA_host"; havana_gene "OTTHUMG00000000959.2";
chr1    HAVANA  transcript  29554   31097   .   +   .   gene_id "ENSG00000243485.5"; transcript_id "ENST00000473358.1"; gene_type "lincRNA"; gene_name "RP11-34P13.3"; transcript_type "lincRNA"; transcript_name "RP11-34P13.3-001"; level 2; transcript_support_level "5"; tag "not_best_in_genome_evidence"; tag "dotter_confirmed"; tag "basic"; havana_gene "OTTHUMG00000000959.2"; havana_transcript "OTTHUMT00000002840.1";

ENSG00000243485.5
ENSG00000243485.5

然后转到grep,其中-f arg指定-,这是 STDIN 的别名。

如果您的第二个文件很大且名称很多,您可以在sort -u之前使用grep

cut -d \" -f 2 < file2 | sort -u | grep -f - file1