- 您的 awk 已损坏或您的输入中有控制字符。
- 您的 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”)。