【发布时间】:2022-01-14 17:20:16
【问题描述】:
我正在使用 bash 脚本从目录中的日志文件中提取一些信息,并将摘要保存在单独的文件中。 在每个日志文件的底部,都有一个类似的表格:
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
从此我只需要从第一行的第二列(-6.961)中获取值,并将其与日志名称一起作为一个字符串添加到新排名_${output}.log
log_name -6.961
所以对于 5 个处理过的日志,它应该是这样的:
# ranking_${output}.log
log_name1 -X.XXX
log_name2 -X.XXX
log_name3 -X.XXX
log_name4 -X.XXX
log_name5 -X.XXX
这是一个简单的 bash 工作流程,它从排名表中获取 ALL THE LINES 并将其与 LOG 文件的名称一起保存:
#!/bin/bash
home="$PWD"
#folder contained all *.log files
results="${home}"/results
# loop each log file and take its name + all the ranking table
for log in ${results}/*.log; do
log_name=$(basename "$log" .log)
echo "$log_name" >> ${results}/ranking_${output}.log
cat $log | tail -n 12 >> ${results}/ranking_${output}.log
done
你能建议我一个 AWK 例程,它只选择位于每个表第一行的最高值吗? 这是我用于另一种格式的 AWK 示例,但在那里不起作用:
awk -F', *' 'FNR==2 {f=FILENAME;
sub(/.*\//,"",f);
sub(/_.*/ ,"",f);
printf("%s: %s\n", f, $5) }' ${results}/*.log >> ${results}/ranking_${output}.log
【问题讨论】: