【问题标题】:bash + awk: extract specific information from ensemble of fillesbash + awk:从填充集合中提取特定信息
【发布时间】: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

【问题讨论】:

    标签: bash awk


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!通常它可以完成工作,只有一个问题:实际上它保存的不是文件名,而是它的完整路径 /Users/gleb/Documents/tutorials/dolce/results/chico_rep01.log -7.219 是否可以修改 awk 以仅保存日志(不带扩展名):chico_rep01?
    • 注意:我只是使用不同的函数来打印输出 printf("%s: %s\n", FILENAME, $2) 我为了在两个术语之间放置分隔符“:”(不知道如果是否比您的解决方案更好):-)
    • 这也是可能的:print FILENAME ":", $2
    • 如果只有某种方法可以设置一个变量来指示输出字段之间的内容,某种输出字段分隔符变量...... :-)。
    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多