gawk 不会过滤掉更大的数字吗?

Gawk not filtering out larger number?

我在我的程序中使用的简单 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+" ' <= "'$price'"' file

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

您的 awk 命令执行 词法 比较 而不是数值比较,因为 RHS - the价格值 - 包含在 双引号.

删除双引号会有所帮助,但建议按如下方式重新表述命令:

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

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

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

您真的要为每一列调用一个单独的 gawk 吗?一个就可以了:

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

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

= 位是 awk 的一个技巧,它使用输出字段分隔符(单个选项卡)重写当前记录。为您省去 tr

的电话