linux - 使用管道在 awk 语句中输入

标签 linux bash awk pipe

所以我正在处理一个名为 cars 的文件,其内容如下:

toyota corolla 1970 2500
chevy malibu 1999 3000
ford mustang 1965 10000
volvo s80 1998 9850
ford thundbd 2003 10500
chevy malibu 2000 3500
honda civic 1985 450
honda accord 2001 6000
ford taurus 2004 17000
toyota rav4 2002 750
chevy impala 1985 1550
ford explor 2003 9500

我使用 grep 来过滤包含特定汽车制造商的行,然后将其通过管道传输到我的 awk 语句,最后将最终结果通过 tee 通过管道传输到新管道。

这是我遇到问题的代码行:

grep "$model" cars | 
   awk '($3+0) >= ("'$max_year'"+0) && ($4+0) <= ("'$max_price'"+0)' | 
     tee last_search

我之前在脚本中将变量 max_year 和 max_price 定义为用户输入。

文件last_search已创建,但它始终为空。

最佳答案

几乎可以肯定您的变量有问题,您应该将它们打印出来并逐渐构建管道,一次一个命令进行调试。

就目前情况而言,它适用于以下值:

$ max_year=2000
$ max_price=10000
$ model=a

$ grep "$model" cars
toyota corolla 1970 2500
chevy malibu 1999 3000
ford mustang 1965 10000
chevy malibu 2000 3500
honda civic 1985 450
honda accord 2001 6000
ford taurus 2004 17000
toyota rav4 2002 750
chevy impala 1985 1550

$ grep "$model" cars | awk '($3+0) >= ("'$max_year'"+0) && ($4+0) <= ("'$max_price'"+0)'
chevy malibu 2000 3500
honda accord 2001 6000
toyota rav4 2002 750

还有更好的方法可以做到这一点,而不必按照您现有的方式管理命令字符串,因为它可能容易出错。您可以使用:

grep "$model" cars |
  awk -vY=$max_year -vP=$max_price '$3>=Y&&$4<=P{print}'

(你会注意到我没有使用 string+0 技巧,GNU awk,你几乎肯定在 Linux 下使用它,处理这个问题很好,如果两个参数本质上都是数字,它将进行数字比较)。

关于linux - 使用管道在 awk 语句中输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117848/

相关文章:

linux - 使用 grep 和 awk 将文件的第一列转换为 unixtime

linux - 如何使用 shell 脚本 ping 一个文件中的多个 IP,并仅打印另一个文件中的在线 IP?

bash - "echo"和 "echo -n"有什么区别?

bash - 我可以 grep 多个模式但有一些是相反的吗?

bash - 读取命令不等待输入

linux - 我如何限制 bash 中的历史记录项的数量?

regex - 使用 AWK [或 sed、grep 等] 删除特定行

linux - 自托管是否适合 Nancy 和 ServiceStack 中的小型 Web 项目?

linux - 录制网络流媒体广播

linux - 使用 bool 查询在术语过滤器中搜索大量关键字会使终端崩溃