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, }'
我正在使用 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, }'