Awk数组正在以意外顺序打印元素

Awk数组正在以意外顺序打印元素,awk,Awk,我使用awk从数据集中捕获时间戳,并打印出与该时间戳相关联的值(内存) 下面的awk代码可以很好地实现这一点 awk ' /show memory compare start/ {getline start_time = $0; } /show memory compare end/ {getline

我使用awk从数据集中捕获时间戳,并打印出与该时间戳相关联的值(内存)

下面的awk代码可以很好地实现这一点

awk '
/show memory compare start/     {getline
                                 start_time = $0;
                                }
/show memory compare end/       {getline
                                 end_time = $0;
                                }
/mibd_interface/{
        print start_time, $3, "\n" end_time, $4
}' snmpoutput.txt

Thu Sep 19 14:38:06.400 WIB 8670334
Thu Sep 19 14:40:56.123 WIB 8484152
Thu Sep 19 14:43:07.946 WIB 8369050
Thu Sep 19 14:45:27.916 WIB 8514825
Thu Sep 19 14:46:28.464 WIB 8446906
Thu Sep 19 14:50:10.422 WIB 8264885
Thu Sep 19 14:50:44.374 WIB 8264884
Thu Sep 19 14:55:05.760 WIB 8264960
将此数据放入数组并打印后,元素出现无序

在将此输出与上面的所需输出进行比较时,我在最右边的列中输入了显示顺序

awk '
/show memory compare start/     {getline
                                 start_time = $0;
                                }
/show memory compare end/       {getline
                                 end_time = $0;
                                }

/mibd_interface/{mem_stats[start_time]=$3; mem_stats[end_time]=$4} END {for (time in mem_stats) {printf "%s => %s\n",time,mem_stats[time]}}' snmpoutput.txt

Thu Sep 19 14:55:05.760 WIB => 8264960  8
Thu Sep 19 14:45:27.916 WIB => 8514825  4 
Thu Sep 19 14:43:07.946 WIB => 8369050  3
Thu Sep 19 14:40:56.123 WIB => 8484152  2 
Thu Sep 19 14:50:44.374 WIB => 8264884  7
Thu Sep 19 14:38:06.400 WIB => 8670334  1  
Thu Sep 19 14:50:10.422 WIB => 8264885  6
Thu Sep 19 14:46:28.464 WIB => 8446906  5
数据集 (已发布示例,因为完整数据集太大)

一次迭代

xr_lab#show memory compare start
Thu Sep 19 14:38:06.400 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out
xr_lab#
xr_lab#
xr_lab#show memory compare end
Thu Sep 19 14:40:56.123 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_end.out
xr_lab#
xr_lab#show memory compare report
Thu Sep 19 14:41:08.084 WIB

PID    NAME                     MEM BEFORE    MEM AFTER  DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------

2550   sysdb_svr_local          7881443     7878256     -3187       87391
7582   mibd_interface           8670334     8484152     -186182     267657
xr_lab#show memory compare start
Thu Sep 19 14:43:07.946 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out
xr_lab#
xr_lab#
xr_lab#
xr_lab#show memory compare end
Thu Sep 19 14:45:27.916 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_end.out
xr_lab#
xr_lab#
xr_lab#show memory compare report
Thu Sep 19 14:45:42.091 WIB

PID    NAME                     MEM BEFORE    MEM AFTER  DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
6777   ospf                     24294569    24283592    -10977      227389
7582   mibd_interface           8369050     8514825     145775      126259
第二次迭代

xr_lab#show memory compare start
Thu Sep 19 14:38:06.400 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out
xr_lab#
xr_lab#
xr_lab#show memory compare end
Thu Sep 19 14:40:56.123 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_end.out
xr_lab#
xr_lab#show memory compare report
Thu Sep 19 14:41:08.084 WIB

PID    NAME                     MEM BEFORE    MEM AFTER  DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------

2550   sysdb_svr_local          7881443     7878256     -3187       87391
7582   mibd_interface           8670334     8484152     -186182     267657
xr_lab#show memory compare start
Thu Sep 19 14:43:07.946 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_start.out
xr_lab#
xr_lab#
xr_lab#
xr_lab#show memory compare end
Thu Sep 19 14:45:27.916 WIB   
Successfully stored memory snapshot in /var/log/malloc_dump_memcmp_end.out
xr_lab#
xr_lab#
xr_lab#show memory compare report
Thu Sep 19 14:45:42.091 WIB

PID    NAME                     MEM BEFORE    MEM AFTER  DIFFERENCE MALLOCS-NEW
-------------------------------------------------------------------------------
6777   ospf                     24294569    24283592    -10977      227389
7582   mibd_interface           8369050     8514825     145775      126259
我能知道为什么元素打印出了问题,以及解决这个问题的最佳方法吗


谢谢。

请尝试以下内容,因为缺少实际输入文件的样本,所以未对其进行测试

第一种解决方案:考虑到任何其他行的时间戳都不会相同,如果是这种情况,那么只需执行以下操作:

awk '
/show memory compare start/{
  getline
  start_time = $0;
  b[++count]=start_time
}
/show memory compare end/{
  getline
  end_time = $0;
  b[++count]=end_time

}
/mibd_interface/{
  mem_stats[start_time]=$3
  mem_stats[end_time]=$4
}
END{
  for(i=1;i<=count;i++){
    printf "%s => %s\n",b[i],mem_stats[b[i]]
  }
}' Input_file
输出如下:


请您尝试以下内容,因为缺少实际输入文件的样本,所以未对其进行测试

第一种解决方案:考虑到任何其他行的时间戳都不会相同,如果是这种情况,那么只需执行以下操作:

awk '
/show memory compare start/{
  getline
  start_time = $0;
  b[++count]=start_time
}
/show memory compare end/{
  getline
  end_time = $0;
  b[++count]=end_time

}
/mibd_interface/{
  mem_stats[start_time]=$3
  mem_stats[end_time]=$4
}
END{
  for(i=1;i<=count;i++){
    printf "%s => %s\n",b[i],mem_stats[b[i]]
  }
}' Input_file
输出如下:

我能知道为什么元素打印出了问题,以及解决这个问题的最佳方法吗

该报告的内容如下:

awk语言提供用于存储数字或字符串的数组。数组不需要声明。它们最初应为空,其大小应动态变化下标或元素标识符是字符串,提供了类型的关联数组功能

它将迭代,以未指定的顺序将数组的每个索引分配给变量

因此,我们知道awk中的数组是一个,只不过是一个键值对组合。编程界的一个经典示例是二叉树,如C++的
std::map
。通常,为了有效地遍历和搜索数组,需要进行排序,但是标准awk没有为我们提供定义这种排序的选项。该标准让实现awk的人可以自由选择密钥顺序。这也是为什么它声明
for(数组中的变量)
将以未指定的顺序遍历数组

另一方面,GNU awk允许在全局级别使用数组变量定义键顺序,在局部级别使用函数定义键顺序。后者将数组
source
的键存储在一个整数索引数组
dest
中。后者被填充,使得键的顺序由函数
how
dest[1]
定义

我能知道为什么元素打印出了问题,以及解决这个问题的最佳方法吗

该报告的内容如下:

awk语言提供用于存储数字或字符串的数组。数组不需要声明。数组最初应为空,并且其大小应动态更改。下标或元素标识符是字符串,提供了一种类型的关联数组功能

它将迭代,以未指定的顺序将数组的每个索引分配给变量

由此可知,awk中的数组只不过是一个键值对组合。编程世界中的一个经典示例是二叉树,如C++的
std::map
。通常,需要对数组进行排序,以有效地遍历和搜索数组,但标准awk并没有给我们定义这样或那样的组合的选项该标准让实现awk的人可以自由选择键顺序。这也是为什么它声明
for(数组中的变量)
将以未指定的顺序遍历数组的原因


另一方面,GNU awk允许使用数组变量在全局级别上定义键顺序,使用函数在局部级别上定义键顺序。后者将数组
source
的键存储在一个整数索引数组
dest
中。后者被填充,以便键的顺序由函数
如何
dest[1]
使用
如何定义
您可以检查我的解决方案一次并让我知道这是否对您有帮助吗?您可以检查我的解决方案一次并让我知道这是否对您有帮助吗?
for (variable in array)
{ key_order[++c]="key"
  data["key"] = "value" }
END { for(i=1;i<=c;++i) print data[key_order[i]] }