使用管道输入awk语句

时间:2014-11-25 02:32:20

标签: 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语句,最后将最终结果传送到带有T恤的新管道。

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

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

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

文件last_search已生成,但它始终为空。

2 个答案:

答案 0 :(得分:3)

你的变量几乎肯定有问题,你应该将它们打印出来,然后逐步建立一个命令,一次调试。

目前,它适用于以下值:

$ 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下使用它,处理得很好,如果两者都可以进行数字比较参数本质上是数字的。)

答案 1 :(得分:2)

set -a
model=malibu
max_year=2000
max_price=4000

awk '
$2 == ENVIRON["model"] &&
$3 >= ENVIRON["max_year"] &&
$4 <= ENVIRON["max_price"]
' cars |
tee last_search