【发布时间】:2014-05-07 02:33:42
【问题描述】:
我有以下 bash 脚本,它从文件中提取数字列表。我想维护他们被拉动的顺序的日志(这是重要信息)。所以我得到了一些帮助(可能来自我在这里找到的一个例子)将信息转储到一个数组中,排序和输出信息。
if [ ! -z "$sort" ]; then
if [[ $sort == ascending ]]; then
gawk '/SCF Done/\
{c++; list[$5]=c}
END {
asorti(list,energies);
for (i=1;i<=c;i++)
printf("%s%s%d\n",energies[i]," - Optimization Step #",list[energies[i]])
print "Total Optimization Steps: "c}
' "$1"
唯一的问题是,我发现存储在行中$5 字段中的值有可能重复。所以在数组的初始构建过程中,list[$5],这个值可能是非唯一的,因此之前的c 值会被覆盖。我已经想到了一些事情(将$5 的值乘以某个随机数,然后再将其重新划分),但如果有一个已经建立(并且更有效)的处理方法,我不会感到惊讶这个我不知道的问题。
这是grep "SCF Done"的输出
SCF Done: E(UM11L) = -1267.67892101 A.U. after 41 cycles
SCF Done: E(UM11L) = -1267.64771239 A.U. after 43 cycles
SCF Done: E(UM11L) = -1267.67892101 A.U. after 39 cycles
SCF Done: E(UM11L) = -1267.67892578 A.U. after 24 cycles
SCF Done: E(UM11L) = -1267.67892051 A.U. after 24 cycles
SCF Done: E(UM11L) = -1267.67892201 A.U. after 22 cycles
我切换到 gawk 格式的全部原因是因为我想提取那些中间数字,然后还创建一个格式化输出,如下所示。我最初使用了一个简单的grep "SCF Done" 语句,但后来获取格式、排序等,开始变成一个相当麻烦的语句来编写。事实还是一样,我希望能够按这些数字排序,同时保留数字和优化步骤之间的相关性(如下所示)。但这些数字并不总是唯一的。
-1267.67892101 - Optimization Step #1
-1267.64771239 - Optimization Step #2
-1267.67892101 - Optimization Step #3
-1267.67892578 - Optimization Step #4
-1267.67892051 - Optimization Step #5
-1267.67892201 - Optimization Step #6
【问题讨论】: