awk输出格式的平均值

时间:2012-05-28 01:33:41

标签: awk format

我正在计算许多值的平均值,并使用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打印值,我不想要,我希望它以圆形图打印值。但我无法找到传递输出格式的位置。

编辑:使用{print "average,%3d = ",sum/NR}'代替{print sum/NR}'没有帮助,因为它正在打印"average,%3d 1.2345e+05"

2 个答案:

答案 0 :(得分:3)

您需要printf而不仅仅是print。打印比printf更简单。

答案 1 :(得分: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 - 一个glob会做。

无用地使用cat

在扩展时引用所有变量。

没有必要使用echo - AWK可以胜任。

没有必要使用grep - AWK可以胜任。

如果您收到1.2345e+05之类的数字,那么%6d可能是比%3d更好的格式字符串。使用printf以使用格式字符串 - print不支持格式字符串。

以下all-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