Awk:在匹配条件后删除重复行而不进行排序

Awk:在匹配条件后删除重复行而不进行排序,awk,uniq,Awk,Uniq,我有一个设备列表,在保留顺序和匹配条件的同时,我需要删除重复的设备(只保留第一次出现的设备)。在本例中,我要查找一个特定的字符串,然后打印带有设备名称的字段。以下是来自sar应用程序的一些原始数据示例: 10:02:01 AM sdc 0.70 0.00 8.13 11.62 0.00 1.29 0.86 0.06 10:02:01 AM sda 0.00 0.00

我有一个设备列表,在保留顺序和匹配条件的同时,我需要删除重复的设备(只保留第一次出现的设备)。在本例中,我要查找一个特定的字符串,然后打印带有设备名称的字段。以下是来自sar应用程序的一些原始数据示例:

10:02:01 AM       sdc      0.70      0.00      8.13     11.62      0.00      1.29      0.86      0.06
10:02:01 AM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:02:01 AM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sdc      1.31      3.73     99.44     78.46      0.02     17.92      0.92      0.12
Average:          sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:05:01 AM       sdc      2.70      0.00     39.92     14.79      0.02      5.95      0.31      0.08
10:05:01 AM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:05:01 AM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:06:01 AM       sdc      0.83      0.00     10.00     12.00      0.00      0.78      0.56      0.05
11:04:01 AM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:04:01 AM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sdc      0.70      2.55      8.62     15.91      0.00      1.31      0.78      0.05
Average:          sda      0.12      0.95      0.00      7.99      0.00      0.60      0.60      0.01
Average:          sdb      0.22      1.78      0.00      8.31      0.00      0.54      0.52      0.01
下面将给出包含单词“average”的行中的设备列表,但它会对输出进行排序:

sar -dp | awk '/Average/ {devices[$2]} END {for (device in devices) {print device}}'
sda
sdb
sdc
下面给出了我想要的(来自的命令):

也许我遗漏了一些非常明显的东西,但我不知道如何在一个awk命令中做到这一点,即不将第一个awk的输出管道化到第二个awk。

您可以:

sar -dp | awk '/Average/ && !devices[$2]++ {print $2}' 
sdc
sda
sdb
问题在于(设备中的设备)的此部分。由于某些原因,的
会随机输出。
我已经阅读了很长一段关于为什么有些地方没有链接的复杂信息

您可以执行以下操作:

sar -dp | awk '/Average/ && !devices[$2]++ {print $2}' 
sdc
sda
sdb
awk '/Average/ && !devices[$2]++ {print $2}' sar.in
问题在于(设备中的设备)
的此部分。由于某些原因,的
会随机输出。
我已经阅读了很长一段关于为什么有些地方没有链接的复杂信息

awk '/Average/ && !devices[$2]++ {print $2}' sar.in
您只需要将这两个测试结合起来。唯一需要注意的是,在原始输入中,整行是原始输入的字段2,因此需要将
$0
替换为
$2


您只需要将这两个测试结合起来。唯一需要注意的是,在原始输入中,整行是原始输入的第二个字段,因此您需要将
$0
替换为
$2

这看起来很像我的帖子:)这看起来很像我的帖子:)据我所知,awk对从数组中检索到的键的顺序没有任何声明。虽然在awk 4中,您可以通知它检索键时要使用的排序(但我不知道“输入顺序”是否是一个选项)。
中的
操作符按照元素在内存中的存储顺序从数组中检索元素,即哈希算法以任何顺序排列元素。如果需要按特定顺序遍历数组,则需要确定顺序(插入顺序?字母顺序?数字顺序?按元素?按索引?其他什么?),并以某种方式编程该顺序。使用GNU awk,您可以通过填充
PROCINFO[“sorted_in”]
来分配订单,请参阅。@EdMorton感谢您的帮助。我的记忆有点有限,出于某种原因,我开始自己删除东西,而不告诉我:)这是链接到
@Jotne告诉我它的
排序\ u。我在学校学过法语,几年前开始学西班牙语,我最终意识到这只是为了腾出空间而把法语从我的大脑中挤出。最终的结果是,我现在两种语言都不会说,而且我几乎不懂英语……据我所知,awk对从数组中检索到的键的顺序没有任何要求。虽然在awk 4中,您可以通知它检索键时要使用的排序(但我不知道“输入顺序”是否是一个选项)。
中的
操作符按照元素在内存中的存储顺序从数组中检索元素,即哈希算法以任何顺序排列元素。如果需要按特定顺序遍历数组,则需要确定顺序(插入顺序?字母顺序?数字顺序?按元素?按索引?其他什么?),并以某种方式编程该顺序。使用GNU awk,您可以通过填充
PROCINFO[“sorted_in”]
来分配订单,请参阅。@EdMorton感谢您的帮助。我的记忆有点有限,出于某种原因,我开始自己删除东西,而不告诉我:)这是链接到
@Jotne告诉我它的
排序\ u。我在学校学过法语,几年前开始学西班牙语,我最终意识到这只是为了腾出空间而把法语从我的大脑中挤出。最终的结果是,我现在两种语言都不会说了,只是勉强掌握了英语。。。。