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
的电话
我在我的程序中使用的简单 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