0

多くの値の平均を計算しawk、次のスクリプトを使用して印刷しています。

for j in `ls *.txt`; do
  for i in emptyloop dd cp sleep10 gpid forkbomb gzip bzip2; do
    echo -n $j $i" "; cat $j | grep $i | awk '{ sum+=$2} END {print sum/NR}'
  done;
  echo ""
done

しかし、問題は、1.2345e+05私が望んでいない in の値を印刷していることです。値を丸数字で印刷したいのです。しかし、出力形式を渡す場所が見つかりません。

編集:{print "average,%3d = ",sum/NR}'の inplace を使用し{print sum/NR}'ても、印刷されているため、役に立ちません"average,%3d 1.2345e+05"

4

2 に答える 2

3

printf単にの代わりに 必要ですprint。print は、printf よりもはるかに単純なルーチンです。

于 2012-05-28T01:38:58.890 に答える
2
for j in *.txt; do
    for i in emptyloop dd cp sleep10 gpid forkbomb gzip bzip2; do
        awk -v "i=$i" -v "j=$j" '$0 ~ i {sum += $2} END {printf j, i, "average %6d", sum/NR}' "$j"
    done
    echo
done

必要ありませんls- グロブで十分です。

の無駄使いcat

変数を展開するときは、すべて引用符で囲みます。

使用する必要はありませんecho- AWK で十分です。

使用する必要はありませんgrep- AWK で十分です。

のような数値を取得している場合は1.2345e+05%6dよりも優れたフォーマット文字列になる可能性があります%3dprintfフォーマット文字列を使用するために使用します -サポートprintしていません。

次のすべて AWK スクリプトは、探していることを実行し、かなり高速になる可能性があります。入力データを見ずに、主に一致するコマンド名が列1にあるといういくつかの仮定をしました。

awk '
    BEGIN {
        cmdstring = "emptyloop dd cp sleep10 gpid forkbomb gzip bzip2";
        n = split(cmdstring, cmdarray);
        for (i = 1; i <= n; i++) {
            cmds[cmdarray[i]]
        }
    }
    $1 in cmds {
        sums[$1, FILENAME] += $2;
        counts[$1, FILENAME]++
        files[FILENAME]
    }
    END {
        for file in files {
            for cmd in cmds {
                printf "%s %s %6d", file, cmd, sums[cmd, file]/counts[cmd, file]
            }
        }
    }' *.txt
于 2012-05-28T02:32:03.860 に答える