简体   繁体   English

AWK在Bash脚本中不起作用

[英]AWK doesn't work in Bash Script

I have the following AWK statement in a script: 我在脚本中有以下AWK语句:

grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE | sort -nk5 | less

When I run the script, the output is blank. 当我运行脚本时,输出为空白。 However, if I run the following: 但是,如果我运行以下命令:

grep -E Toronto listing.dat | awk -F "[\t]+" '($3 >= 2) && ($4 >= 500) && ($5 <= 900000) && ($6 <= 10)' listing.dat | sort -nk4 | less

It outputs as expected. 它按预期输出。

I have no idea why this is happening, and I have even replaced the awk statement in the script to echo out the variables to make sure they're passing correctly and they are. 我不知道为什么会这样,我什至替换了脚本中的awk语句以回显变量,以确保它们正确传递。

Here is the script thus far: 到目前为止,这是脚本:

    #!/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

Can you please help? 你能帮忙吗?

Thanks 谢谢

If new to any *nix utility, you can see basic docs using 'man utility_name'; 如果不是* nix实用程序的新手,则可以使用'man utility_name'查看基本文档; from the man page for 'awk' (man awk): 从'awk'(man awk)的手册页中:

-v var=val -v var = val
Assign the value val to the variable var, before execution of the program begins. 在程序开始执行之前,将值val分配给变量var。 Such variable values are available to the BEGIN block of an AWK program. 这样的变量值可用于AWK程序的BEGIN块。

There are other ways to do this, but following the docs your code would be changed to something like: 还有其他方法可以执行此操作,但是在文档之后,您的代码将更改为:

awk -F "[\t]+" \  
  -v MINBED=$minbed -v MINSQFT=$minsqft -v MAXPRICE=$maxprice -v MAXWEEKS=$maxweeks \
  '($3 >= MINBED) && ($4 >= MINSQFT) && ($5 <= MAXPRICE) && ($6 <= MAXWEEKS)'  

I'm not able to comment yet due to reputation. 由于声望,我无法发表评论。 Another thing you can do is escape the single quotes around your variable names. 您可以做的另一件事是对变量名周围的单引号进行转义。 If you're still having trouble with all cities showing up, I believe it's because you're supplying awk with the filename. 如果您仍然遇到所有城市出现的问题,我相信这是因为您正在向awk提供文件名。 It looks like you need to take that out and let the grep's output be used as input for your awk. 看来您需要将其删除,然后将grep的输出用作awk的输入。 I don't have access to my linux box to test it but: 我无权访问我的Linux机器进行测试,但:

your line (having $DATFILE supplied twice): 您的行(两次提供$ DATFILE):

grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE;

option 1: remove the second $DATFILE, escape single quotes 选项1:删除第二个$ DATFILE,转义单引号

grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= '$minbed') && ($4 >= '$minsqft') && ($5 <= '$maxprice') && ($6 <= '$maxweeks')';

option 2: you may be able to get rid of the grep entirely, with escaped single quotes. 选项2:您可以使用转义的单引号完全摆脱grep。 awk's IGNORECASE should be a substitute for grep's -E. awk的IGNORECASE应该代替grep的-E。

awk -F "[\t]+" 'IGNORECASE = 1;/'$city'/&&($3 >= '$minbed')&&($4 >= '$minsqft')&&($5 <= '$maxprice')&&($6 <= '$maxweeks')';

Like I said, can't test it for syntax at the moment; 就像我说的,目前无法测试其语法; I hope it helps ya. 希望对您有帮助。

Happy hacking! 骇客入侵!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM