Gawk没有过滤掉更大的数字?

时间:2015-12-05 01:30:01

标签: linux bash unix awk gawk

我程序中使用的简单gawk过滤器不会过滤掉比其余数字长的数字值。

这是我的文本文件:

172 East Fourth Street      Toronto     4   1890    1500000     6
2213 Mt. Vernon Avenue      Vaughn      2   890     500000      4
One Lincoln Plaza           Toronto     2   980     900000      1

列由制表符分隔。

我的gawk脚本:

echo "Enter max price"
read price 

gawk -F "\t+" '$5 <= "'$price'"' file

如果输入值150001或更高,则会显示1500000值。我认为这与gawk没有正确读取最后一位数字有关。我不允许更改原始文本文件,我需要使用gawk命令。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:4)

您的 awk命令执行 lexical 比较而非数字比较,因为 RHS - 价格值 - 包含在 double中-quotes

删除双引号会有所帮助,但建议按以下方式重新配置命令:

 gawk -F '\t+' -v price="$price" '$5 <= price' file

shell 变量$price现在使用-v传递给Awk,作为 Awk 变量price,这是安全的将值传递给awk的方法 - 然后您可以使用单个 - 引用awk脚本,而无需拼接shell变量或不必担心哪些部分可能会被扩展贝壳在前面。

事后补充:正如Ed Morton在评论中指出的那样, 确保将字段或变量视为 ,将+0附加到其中;例如,$5 <= price+0(相反,附加""强制将处理作为字符串)。
默认情况下,Awk 从所涉及的值和上下文中推断是否将给定值解释为字符串或数字 - 这可能并不总能给出所需的结果。

答案 1 :(得分:2)

你真的在为每一列调用一个单独的gawk?一个人会这样做:

gawk -F "\t+" -v OFS="\t"   \
    -v city="$city"         \
    -v bedrooms="$bedrooms" \
    -v space="$space"       \
    -v price="$price"       \
    -v weeks="$weeks"       '
        $2 == city && $3 >= bedrooms && $4 >= space && $5 <= price && $6 <= weeks {
            $1 = $1; print
        }
' listing |
sort   -t $'\t' $sortby $ordering |
column -s $'\t' -t

(这不是答案,只是需要格式化的评论)

$1=$1位是一个awk技巧,它使用输出字段分隔符(单个选项卡)重写当前记录。保存您对tr

的通话