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