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

Awk 如何在一个文件中查找与另一个文件匹配的条目,awk,grep,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.

我有一个包含以下内容的文件(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列中找到与另一个文件(文件2)第10列中的文本匹配的条目:

在第10列中,名称位于“”

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

试试以下方法:

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

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

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

cut -d \" -f 2 < file2 | sort -u | grep -f - file1
cut-d\”-f2
纯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

你的帖子中的
file1
file2
是什么?我粘贴的两个文件。我根据文件中的行数编辑了多少行?大约350000。我的grep似乎不喜欢这样,它回吐:grep:-:没有这样的文件或目录。我在没有-,的情况下运行它似乎有点慢,但希望能给出仍在运行的答案。我需要一个不使用grep的解决方案,对于这样的事情来说速度太慢了如果你
cut | sort-u | grep-f-
这必须变得更轻!第一个解决方案不起作用,它返回一个空白文件。第二个解决方案的awk部分似乎起作用,尽管输出是“ENSG0000243485.5”[[:blank:]对于每一行。grep正在运行…非常…缓慢…需要对字段10进行一些清理,修改代码。您的示例返回空结果,但如果您在数据中的筛选器中添加了一个值,它将返回相应的行。我不理解。我需要它对文件2进行第10列检查,并对文件1的第1列中的每个条目进行搜索,如果entry matches然后为匹配的entriesright创建一个新文件,但文件2中的第10列的格式与文件1的格式不同。您有一个左右引号和一个
对,我不能在该列中搜索文件1中找到的特定文本吗?或者我必须先清理文件2中的列吗?
ENSG00000243485.5
ENSG00000243485.5
cut -d \" -f 2 < file2 | sort -u | grep -f - file1
awk 'FNR==NR{gsub(/[";]/,"",$10);F[$10];next}( $1 in F )' FilterFile2 DataFile1
awk '{gsub(/[";]/,"",$10);print "^" $10 "[[:blank:]]"}' FilterFile2 > CleanFilter 
grep -E -f  CleanFilter DataFile1