1

私は次のawkワンライナーを持っています:

{dict[$2"@"$6]=($(NF-2)/($(NF-2)+$NF))*100 } END {for (a in dict) {  printf "%s %d :" ,  a, int(dict[a]) }}

私が必要としているのは、各辞書キーの組み合わせの値に追加することです

($(NF-2)/($(NF-2)+$NF))*100 " out of"  $(NF-2)+$NF 

だから私はawkにすべての数学を計算させ、次に文字列を作成してそれを辞書の値として入れたいと思っています。私はすでにスペースと角かっこをいくつか組み合わせて試しましたが、それでもうまくいきませんでした。

変数は入力ストリームから入力されます:

$2 - host , not unique in input stream
$3 - partition , not unique in input stream
$NF - space avail 
$NF-2 - space used
$(NF-2)+$NF - gives you overall capacity of partiton 

出力は

80% host1@/local/1

期待される出力:

80% host1@/local/1   out of 112G

- - - - - - - - - - - 解決 - - - - - - - - - - - - - - --------

以下の良いキャッチで、私はこれを解決しました。問題は、printf部分でint()を実行したことで、出力が切り捨てられました。さらに、ラップアラウンドシェル部分で他の問題に直面したため、最終的なコードは、質問をすることを期待していたものとは異なりました。

'{key=($2 "@" $6 " out of " int((($(NF-2)+$NF)/1000)/1000) "GB" ) ; dict[key]=($(NF-2)/($(NF-2)+$NF))*100 } END {for (a in dict) {  printf "%s ,  %d :" ,  a, int(dict[a]) }}'

私の場合、dict値は文字列にできないため、「out of」と容量部分を辞書キーに移動しました。さらに、INTと比較します。

4

1 に答える 1

2

連結は正常に機能しています。それは問題ではありません。

int()問題は、印刷時にディクショナリ値を計算していることです。値は文字列であるため、結果は切り捨てられます。使用する必要がある場合int()は、印刷時ではなく、計算を実行するときに使用してください。

ちなみに、サンプルデータを提供していれば、コードをテストして回答を提供する方がはるかに簡単でした。これは特に重要です。なぜなら、ここにあるように、問題が予期されていた場所とは異なる場所にある場合があるからです。

于 2012-08-01T19:38:25.367 に答える