这是使用awk
:
awk 'BEGIN { while(getline l < "patterns.txt") PATS[l] } $2 in PATS' file2
file1
您正在搜索的文件在哪里,并且patterns.txt
是每个文件具有一个精确模式的文件。隐式{print}
已被省略,但您可以添加它并在那里做任何您喜欢的事情。
$2 in PATS
如果第二列恰好是模式之一,则条件为真。
如果patterns.txt
要被视为正则表达式匹配,请将其修改为
ok=0;{for (p in PATS) if ($2 ~ p) ok=1}; ok
因此,例如,要$2
针对 中的所有正则表达式进行测试,如果第二列匹配patterns.txt
,则打印
第三列:
awk 'BEGIN { while(getline l < "patterns.txt") PATS[l] }
ok=0;{for (p in PATS) if ($2 ~ p) ok=1}; ok
{print $3}' < file2
这是perl
. 与awk
版本类似,只是它使用正则表达式而不是字段。
perl -ne 'BEGIN{open $pf, "<patterns.txt"; %P=map{chomp;$_=>1}<$pf>}
/^\s*([^\s]+)\s+([^\s]+).*$/ and exists $P{$2} and print' < file2
把它分开:
BEGIN{
open $pf, "<patterns.txt";
%P = map {chomp;$_=>1} <$pf>;
}
将您的模式文件读入 has%P
以便快速查找。
/^\s*([^\s]+)\s+([^\s]+).*$/ and # extract your fields into $1, $2, etc
exists $P{$2} and # See if your field is in the patterns hash
print; # just print the line (you could also
# print anything else; print "$1\n"; etc)
如果您的输入文件是制表符分隔的(并且当您知道字段之间只有一个制表符时),它会稍微短一些。这是一个将模式与第5列匹配的示例:
perl -F"\t" -ane '
BEGIN{open $pf, "<patterns.txt"; %P=map{chomp;$_=>1}<$pf>}
exists $P{$F[4]} and print ' file2
这要归功于 perl 的-F
运算符,它告诉 perl 根据分隔符(\t
在本例中)自动拆分为列。请注意,由于从perl
开始的0
数组$F[4]
是第 5 个字段。