我程序中使用的简单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命令。任何帮助表示赞赏!
答案 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