我在脚本中有以下AWK语句:
grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE | sort -nk5 | less
运行脚本时,输出为空白。但是,如果我运行以下内容:
grep -E Toronto listing.dat | awk -F "[\t]+" '($3 >= 2) && ($4 >= 500) && ($5 <= 900000) && ($6 <= 10)' listing.dat | sort -nk4 | less
按预期输出。
我不知道为什么会这样,我甚至更换了脚本中的awk语句来回显变量,以确保它们正确传递并且它们是。
到目前为止,这是脚本:
#!/bin/bash
DATFILE=listing.dat
if [ -f ${DATFILE} ];
then
echo -n "Are you looking into anywhere in the GTA, or a specific city?: "
read uinput
if [ $uinput == "anywhere" ];
then
echo "You have chosen anywhere"
elif [ $uinput == "specific" ];
then
echo -n "Which city?: "
read city
echo -n "Minimum Number of Bedrooms: "
read minbed
echo -n "Minimum Square Footage (500, 600, etc): "
read minsqft
echo -n "Maximum Price: "
read maxprice
echo -n "Maximum Weeks On Market: "
read maxweeks
echo -n "Sort by (price, sqrft, weeks): "
read sortby
if [ $sortby == "price" ];
then
echo -n "Sort by (asc, desc): "
read ascdesc
if [ $ascdesc == "asc" ];
then
grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE | sort -nk5 | less
elif [ $ascdesc == "desc" ];
then
grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE | sort -rnk5 | less
fi
fi
fi
else
echo "${DATFILE} Not found!"
fi
你能帮忙吗?
由于
答案 0 :(得分:2)
如果对任何* nix实用程序不熟悉,您可以使用'man utility_name'查看基本文档;来自'awk'(man awk)的手册页:
-v var = val
在程序开始执行之前,将值val分配给变量var。这些变量值可用于BEGIN块 AWK计划。
还有其他方法可以做到这一点,但是根据文档,您的代码将更改为:
awk -F "[\t]+" \
-v MINBED=$minbed -v MINSQFT=$minsqft -v MAXPRICE=$maxprice -v MAXWEEKS=$maxweeks \
'($3 >= MINBED) && ($4 >= MINSQFT) && ($5 <= MAXPRICE) && ($6 <= MAXWEEKS)'
答案 1 :(得分:0)
由于声誉,我暂时无法发表评论。您可以做的另一件事是绕过变量名称的单引号。如果您仍然遇到所有城市出现问题,我相信这是因为您正在为awk提供文件名。看起来您需要将其取出并让grep的输出用作awk的输入。我无法访问我的linux机箱进行测试,但是:
你的行(提供两次$ DATFILE):
grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE;
选项1:删除第二个$ DATFILE,转义单引号
grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= '$minbed') && ($4 >= '$minsqft') && ($5 <= '$maxprice') && ($6 <= '$maxweeks')';
选项2:您可以使用转义单引号完全摆脱grep。 awk的IGNORECASE应该是grep&#39; s -E的替代品。
awk -F "[\t]+" 'IGNORECASE = 1;/'$city'/&&($3 >= '$minbed')&&($4 >= '$minsqft')&&($5 <= '$maxprice')&&($6 <= '$maxweeks')';
就像我说的那样,目前无法测试它的语法;我希望它能帮到你。
快乐的黑客攻击!