Unix 从一个文件中获取模式,与另一个文件的列进行比较,使用awk打印匹配行

Unix 从一个文件中获取模式,与另一个文件的列进行比较,使用awk打印匹配行,unix,sed,awk,grep,Unix,Sed,Awk,Grep,我基本上想结合 grep -f 与 也就是说,我想用模式输入文件(文件2)搜索文件(文件1)的特定列。如果仅找到匹配项: > outputfile.txt 从上一篇文章来看,这条awk路线非常接近: awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if($0~i){n=1}}} n' file1 file2 取自 但它不会搜索文件1的特定列。我也愿意使用其他工具。这是使用awk: awk 'BEGIN { while(getline l &l

我基本上想结合

grep -f 

也就是说,我想用模式输入文件(文件2)搜索文件(文件1)的特定列。如果仅找到匹配项:

> outputfile.txt
从上一篇文章来看,这条awk路线非常接近:

awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if($0~i){n=1}}} n' file1 file2
取自


但它不会搜索文件1的特定列。我也愿意使用其他工具。

这是使用
awk

awk 'BEGIN { while(getline l < "patterns.txt") PATS[l] } $2 in PATS' file2
例如,要针对
patterns.txt
中的所有regexp测试
$2
,并打印 第三列如果第二列匹配:

awk 'BEGIN { while(getline l < "patterns.txt") PATS[l] } 
     ok=0;{for (p in PATS) if ($2 ~ p) ok=1}; ok 
    {print $3}' < file2
把它拆开:

开始{

打开$pf,“我不太确定列的区别在这个场景中起到了什么作用。您是否处理某种csv文件?您是否注意正则表达式列表文件中的列分隔符?如果文件中没有由某些分隔符分隔的不同列,您可以使用
grep

grep -o -f file2 file1
如果列是一个问题,可能是这样的:

grep -o "[^,]*" file1 | grep -f file2
awk 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($2 ~ p) { print $0; break } }' patterns file

其中,
是分隔符。

您找到的示例确实非常接近您想要的,唯一的区别是您不想匹配整行(
$0

将其修改为如下内容:

grep -o "[^,]*" file1 | grep -f file2
awk 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($2 ~ p) { print $0; break } }' patterns file
如果只需要固定字符串匹配,请使用
index()
函数,即用
索引($2,p)
替换
$2~p

您还可以将列号作为参数提供给awk,例如:

awk -v col=$col 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($col ~ p) { print $0; break } }' patterns file
编辑-全域匹配 您可以使用
=
操作符完成此操作:

awk -v col=$col 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($col == p) { print $0; break } }' patterns file

令人印象深刻。似乎我再也无法避免处理
awk
。感谢您的详细解释。谢谢!这对较少数量的模式很有效。在我的1000个大列表中,它似乎已耗尽内存。我的模式是固定字符串,我只需要精确匹配。我知道,例如,在使用Grep时,添加固定字符串字符串选项(-F)真的减少了处理时间。是否有一个awk等价物?如果您尝试一下我刚刚发布的
perl
版本会怎么样?awk的哪个版本以及您运行的是什么类型的
OS
?当输入一个大列表时,perl版本似乎只检索一个模式,然后退出。运行Mountain Lion。谢谢!这很好n较小数量的模式。我的模式是固定字符串,我只需要精确匹配。我知道,例如,在使用Grep时,添加固定字符串选项确实可以减少处理时间。是否有awk等效项?@ChrisJ.Vargo:是的,
index
函数进行固定字符串匹配(如答案中所述)谢谢,但是:awk'NR==FNR{pats[$0]=1;next}{for(p in pats)if(index($5,p)){print$0;break}'1.txt PrimaryTweets.tsv>1Method2index.tsv不返回精确匹配。有没有办法强制进行精确匹配?@ChrisJ.Vargo:那么您真正想要的是整词匹配还是整字段匹配?请参阅编辑整字段匹配。如果您是指整词,则需要使用正则表达式或进行进一步的字段拆分。这是制表符sepa分级,第五列。grep是否可以跳过前55个字符,然后只返回在第一个选项卡之前找到的匹配项?这将迫使它从第五列开始,在下一列之前停止。我喜欢grep,因为使用固定字符串选项,它比awk快得多。grep中关于选项卡的
grep
中有一个bug,但我们需要它通过使用Perl开关
-P
,您可以像预期的那样传递它们:
\t
。但是,这里似乎更适合使用
cut
,其分隔符默认为tab,可以准备文件1(
-f5
)。
awk 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($2 ~ p) { print $0; break } }' patterns file
awk -v col=$col 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($col ~ p) { print $0; break } }' patterns file
awk -v col=$col 'NR==FNR { pats[$0]=1; next } { for(p in pats) if($col == p) { print $0; break } }' patterns file