我正在使用 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 作業流程,它從排名表中獲取所有行并將其與 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
uj5u.com熱心網友回復:
與awk. 如果第一列包含1列印檔案名和第二列到檔案output:
awk '$1=="1"{print FILENAME, $2}' *.log > output
更新以洗掉路徑和后綴 (.log):
awk '$1=="1"{sub(/.*\//,"",FILENAME); sub(/\.log/,"",FILENAME); print FILENAME, $2}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378745.html
上一篇:%在%PATH%中做什么?
