我有一个文件(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,但我似乎无法正确使用语法。任何帮助将不胜感激。
答案 0 :(得分:1)
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