【发布时间】:2022-01-24 01:00:45
【问题描述】:
我正在使用 bash + awk 从目录中的日志文件中提取一些信息,并将摘要保存在单独的文件中。 在每个日志文件的底部,都有一个类似的表格:
mode | affinity | dist from best mode
| (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
1 -6.961 0 0
2 -6.797 2.908 4.673
3 -6.639 27.93 30.19
4 -6.204 2.949 6.422
5 -6.111 24.92 28.55
6 -6.058 2.836 7.608
7 -5.986 6.448 10.53
8 -5.95 19.32 23.99
9 -5.927 27.63 30.04
10 -5.916 27.17 31.29
11 -5.895 25.88 30.23
12 -5.835 26.24 30.36
因此,我需要关注位于第二列的(负)值。值得注意的是,我需要从第二列中获取 10 个第一个值(从 -6.961 到 -5.916)并计算它的平均值并将平均值与日志名称一起保存为新的ranking.log 中的一个字符串 所以对于 5 个处理过的日志,它应该是这样的:
# ranking_${output}.log
log_name1 -X.XXX
log_name2 -X.XXX
log_name3 -X.XXX
log_name4 -X.XXX
log_name5 -X.XXX
其中 -X.XXX 是为每个日志计算的前 10 个位置的平均值。
这是我集成在 bash 函数中的 awk 代码,它从每个日志中提取第一个值(示例表中的 -6.961)(没有平均计算)。
# take only the first line (lowest dG) from each log
take_the_first_value () {
awk '$1=="1"{sub(/.*\//,"",FILENAME); sub(/\.log/,"",FILENAME); printf("%s: %s\n", FILENAME, $2)}' "${results}"/*.log > "${results}"/ranking.csv
}
我可以修改 AWK 部分以添加 MEAN 值的计算,而不是始终采用位于表第一行的值吗?
【问题讨论】:
-
该表中是否总是有 10 个或更多目标行(其中 $2 为负数)?如果存在少于 10 行或输入文件为空,您有多个答案将失败。
标签: awk