bash + awk:从 filles 集合中提取特定信息

bash + awk: extract specific information from ensemble of filles

我正在使用 bash 脚本从目录中的日志文件中提取一些信息,并将摘要保存在单独的文件中。 在每个日志文件的底部,有一个 table 像:

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 工作流程,它从排名 table 中提取所有行并将其与 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 例程,该例程 select 仅位于每个 table 第一行的最高值? 这是我用于另一种格式的 AWK 示例,它在那里不起作用:

awk -F', *' 'FNR==2 {f=FILENAME; 
                     sub(/.*\//,"",f);
                     sub(/_.*/ ,"",f);
                     printf("%s: %s\n", f, ) }' ${results}/*.log >> ${results}/ranking_${output}.log

awk。如果第一列包含 1 打印文件名和第二列到文件 output:

awk '=="1"{print FILENAME, }' *.log > output

删除路径和后缀 (.log) 的更新:

awk '=="1"{sub(/.*\//,"",FILENAME); sub(/\.log/,"",FILENAME); print FILENAME, }'