【问题标题】:awk - Search for multiple command line arguments in text fileawk - 在文本文件中搜索多个命令行参数
【发布时间】:2019-04-20 00:31:42
【问题描述】:

所以我有一个名为 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" 但这没有用。

【问题讨论】:

  • 对于alarm system,您要搜索包含alarm[space]systemalarm or system 的行吗?
  • 报警[空间]系统一号
  • 好吧,对不起,我是新来的,没有看到那个页面。

标签: regex bash shell awk


【解决方案1】:

在第四个字段中不分顺序地搜索所有单词

$ 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}" ...

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

【讨论】:

  • 感谢您的回答!也许我的描述不够清楚,但我需要它来处理我在 -search 参数之后输入的任何单词,而不仅仅是“未配备警报系统”。为了更好地理解,我将发布另一个示例: 输入:bash real.sh -search unfurnished阳台输出:16;97;60;balcony, unfurnished, alarm system 我尝试了您的解决方案,将 'words=' 之后的部分替换为 "$ {@:2}" 如果我​​只输入 1 个单词,它就可以工作,否则我会收到错误:"无法打开文件 `BEGIN{FS=";"} {n=split(words,ks,"")} {for (i=1;i
  • 对不起,应该是${*:2} 否则,您可以使用temp="${@:2}" 并使用"$temp" 作为脚本变量。
  • 是的,它现在完美运行!感谢您的耐心和帮助! :)
【解决方案2】:

正如您评论的那样,您想要精确地 foo bar 而不是 foo or bar,然后您可能想要更改参数格式,例如,让它们以逗号分隔:foo bar,blah,这将搜索 foo bar 和 @987654325 @。否则你无法区分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{....

【讨论】:

    【解决方案3】:

    您需要 awk 解决方案吗?

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

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多