awk-在文本文件中搜索多个命令行参数

时间:2018-11-16 19:36:09

标签: regex bash shell awk

因此,我有一个名为data.dat的文件,其中包含有关一些用';'分隔的不动产的数据。 (他们所在的地区,区域,价格和简要说明)。

例如:

13;78;44;garage, balcony, multiple floors  
23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system  

我正在编写一个shell脚本,其中列出了符合命令行参数中给出的搜索条件的单元。因此,例如,如果我这样运行程序:

bash real.sh -search alarm system unfurnished

输出应为:

23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system 

我有以下代码可以检查-search之后的第一个单词:

if test "$1" = "-search"
   then awk -v word="$2" 'BEGIN{FS=";"} {if ($4 ~ word) {print $0}}' data.dat;
   exit 1;
fi

但是我需要这个程序才能在搜索后检查任何单词。我该怎么办?我尝试使用正则表达式“ $ {@:2}”而不是“ $ 2”,但这没有用。

3 个答案:

答案 0 :(得分:0)

在第四个字段中搜索所有单词,无论其顺序如何

$ awk -F';' -v words="alarm system unfurnished" '
             BEGIN {n=split(words,ks," ")} 
                   {for(i=1;i<=n;i++) if($4!~ks[i]) next}1' file

23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system

如果您要查找匹配的任何单词,请将最后一部分更改为

... if($4~ks[i]) {print; next}}' file

由于示例没有部分匹配的大小写,因此不确定您要选择哪一个。

如果要使用用户输入直接更改为

... words="${*:2}" ...

保持其余部分不变。但是不清楚,您正在寻找所有匹配的单词还是任何一个单词。

答案 1 :(得分:0)

正如您所评论的那样,您只需要foo bar而不是foo or bar,然后您可能想要更改参数格式,例如,将它们用逗号分隔:foo bar,blah,此搜索foo barblah。否则,您将无法区分foo[space]barfoo or bar。因此,您可以执行以下操作:

awk -F';' -v p="alarm system,unfurnished" 'BEGIN{gsub(",","|",p)} $4~p' file

确保您可以让p变量由shell变量分配:

awk -F';' -v p="$search" 'BEGIN{....

答案 2 :(得分:0)

您需要awk解决方案吗?

$ cat patterns
alarm
system
furnished

$ egrep -f patterns file
23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system