[英]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.