我正在使用Aho,Kernighan的书“The AWK programming langauge”。 在第20页,他们给出了一个在我的系统上不起作用的程序。
emp.data是
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
他们给出的程序是
awk '{ printf("%6.2f %s\n" , $2*$3, $0) }' emp.data | sort
他们给出的输出是
但我的输出是
0.00 Beth 4.00 0
0.00 Dan 3.75 0
100.00 Mark 5.00 20
121.00 Mary 5.50 22
40.00 Kathy 4.00 10
76.50 Susie 4.25 18
发生了什么事?
答案 0 :(得分:2)
要使“2”脱离:printf是内置语言结构,而不是函数。当你这样做时:
printf("%s",foo)
你没有调用带有2个参数的printf函数,你正在调用带有1个参数的printf内置函数,你从“(”“%s”“,”“foo”和“)”构造。正确的语法很简单:
printf "%s",foo
但你可以在任何一个周围加上括号,它不会添加任何值,但也不会破坏它。其中任何一个都会以相同的方式“起作用”:
printf ("%s"),foo
printf "%s",(foo)
printf ("%s"),(foo)
printf (((((((((("%s",foo))))))))))
更重要的是,虽然上面有点“1”:你告诉awk生成格式为:
的输出"%6.2f ...."
表示前导数字应填充左侧最多2个前导空格,但输出的第一行没有前导空格。这会影响你的“排序”,但是由于给出了字符串,所以这里也会有更多的事情发生:
2
10
如果你进行数字排序或字母排序并不重要,因为2在数值上小于10,但空间在数值上小于1,所以结果应该是相同的。
但是,您的发布输出暗示您的排序按字母顺序排序,使“100”小于“40”,这不是排序的工作方式。即使你的语言环境中的某种方式按字母顺序大于“1”,也无法解释为什么你得到相当于:
2
10
3
在你的输出中,即有时候它会将空间视为小于1,其他时间则更多。
由于你的awk显然产生了错误的输出,你的awk或输入文件肯定存在问题,所以我认为你的排序工具也不太可能存在问题。
如果您希望帮助调试问题,请尝试使用这些命令并发布结果:
$ awk '{ printf "%6.2f\n" , $2*$3 }' emp.data
0.00
0.00
40.00
100.00
121.00
76.50
$ awk '{ printf "%6.2f\n" , $2*$3 }' emp.data | sort
0.00
0.00
40.00
76.50
100.00
121.00
我有另外一个想法 - 如果你搞砸了你的awk输出的复制/粘贴,那么也许这是一个语言环境问题。试着这样做:
export LC_ALL=C
然后再次运行命令(排序时不带“-n”)。
答案 1 :(得分:0)
他们假设按数字排序,您的排序似乎按字母顺序排列。
查看排序命令行选项,看看是否可以将其设为数字。
答案 2 :(得分:0)
最后尝试sort -n
,进行数字排序。默认排序会在2之前放置10。