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

但问题是,它正在打印 in 中的值1.2345e+05,这是我不想要的,我希望它以圆形打印值。但我无法找到传递输出格式的位置。

编辑:使用{print "average,%3d = ",sum/NR}'inplace of{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- 一个 glob 就可以了。

无用的使用cat

扩展时引用所有变量。

没有必要使用echo- AWK 可以完成这项工作。

没有必要使用grep- AWK 可以完成这项工作。

如果你得到这样的数字,1.2345e+05那么%6d可能是比 . 更好的格式字符串%3d。使用printf以使用格式字符串 -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 回答