0

我正在使用 Aho,Kernighan 的书“AWK 编程语言”。在第 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

那么发生了什么?

4

3 回答 3

2
  1. 您的 awk 已损坏或您的输入中有控制字符。
  2. 您的 printf 语法错误(但仍会产生正确的输出)

让“2”不碍事: printf 是一种内置语言结构,而不是一个函数。当你这样做时:

printf("%s",foo)

您不是使用 2 个参数调用 printf 函数,而是使用从“(”“%s”“”“foo”和“)”构造的 1 个参数调用 printf 内置函数。正确的语法很简单:

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

在您的输出中,即有时它会将空间视为少于一次,而将其他时间视为更多。

由于您的 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”)。

于 2012-11-02T05:33:52.633 回答
0

他们假设按数字排序,您的排序似乎默认为按字母顺序。

查看您的排序命令行选项,看看您是否可以将其设为数字​​。

于 2012-11-02T03:46:27.313 回答
0

最后尝试sort -n进行数字排序。默认排序会将 10 放在 2 之前。

于 2012-11-02T03:48:53.363 回答