没有得到awk中的排序输出

时间:2012-11-02 03:43:09

标签: awk

我正在使用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

他们给出的输出是

enter image description here

但我的输出是

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

发生了什么事?

3 个答案:

答案 0 :(得分:2)

  1. 您的awk已损坏,或者您的输入中有控制字符。
  2. 您的printf语法错误(但仍会产生正确的输出)
  3. 要使“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。