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

出力で、つまり、スペースを 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」なし)。

于 2012-11-02T05:33:52.633 に答える
0

彼らは並べ替えが数字で並べ替えられると想定していましたが、あなたの並べ替えはデフォルトでアルファベット順に表示されます。

sort コマンドラインオプションを見て、数値にできるかどうかを確認してください。

于 2012-11-02T03:46:27.313 に答える
0

sort -n最後に数値ソートを試してみてください。デフォルトの並べ替えでは、2 の前に 10 が配置されます。

于 2012-11-02T03:48:53.363 に答える