这是使用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
例如,针对patterns.txt 中的所有正则表达式测试$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
这是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 个字段。