我正在计算许多值的平均值,并使用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"
。
答案 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