使用grep查找列表子集的最佳方法是什么?

时间:2010-09-21 23:00:07

标签: shell

我目前的解决方案:

#!/bin/sh
while read file2
do
grep $file2 file1
done

file1的内容将类似于:

atlanta,blue,20090805
newyork,blue,20090805
washington,blue,20090805
dallas,blue,20090805
jacksonville,blue,20090805

file2的内容将类似于:

newyork
dallas
jacksonville

并且文件的所需输出类似于:

newyork,blue,20090805
dallas,blue,20090805
jacksonville,blue,20090805

当根据第二个列表中的名称搜索大型列表的子集时,执行此类操作的最佳方法是什么?任何建议将不胜感激!

谢谢,

3 个答案:

答案 0 :(得分:1)

怎么样......

egrep -f file2 file1

对于您的示例案例,它应该像您的循环一样工作;它应该适用于你的口头描述和你的循环所做的相同范围的情况(“第二个列表”文件中每行一个“名称”,即没有egrep可能曲解的标点符号。) / p>

答案 1 :(得分:0)

这是作弊,因为它是perl,但这是两个单行:

#!/bin/bash
REGEX=`perl -lne 'push(@x,$_);END{print join("|",@x)."\n";}' < file2`
perl -ne 'print $_ if (/\b(?:$ENV{REGEX})\b/o);' < file1

第一行创建一个表单的选项列表:newyork | dallas | jacksonville并将其存储在环境变量REGEX中。 然后第二行将打印任何匹配的行(newyork | dallas | jacksonville)。正则表达式的各个部分:

  • \ b表示仅当城市被字边界包围时才会起作用。这意味着“york”与“newyork”不匹配。
  • ?:表示perl不会尝试捕获该组,从而提高性能。
  • $ ENV {REGEX}从环境中获取参数。
  • 如果没有/ o,perl会尝试重新评估每行的$ ENV变量,导致性能不佳。

答案 2 :(得分:0)

$ awk -F"," 'FNR==NR{a[$1]}NR>FNR && ($1 in a)' file2 file1
newyork,blue,20090805
dallas,blue,20090805
jacksonville,blue,20090805