因此,我有一个名为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”,但这没有用。
答案 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 bar
和blah
。否则,您将无法区分foo[space]bar
或foo 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