AWK在Bash Script中不起作用

时间:2015-12-03 23:40:00

标签: linux bash shell awk

我在脚本中有以下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

你能帮忙吗?

由于

2 个答案:

答案 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')';

就像我说的那样,目前无法测试它的语法;我希望它能帮到你。

快乐的黑客攻击!