Uniq 基于最后一个字段,保留最后一行,并附加重复项数

Uniq 基于最后一个字段,保留最后一行,并附加重复项数

我需要一些帮助来在 bash 脚本中实现 awk 命令以实现以下逻辑。尝试了 sort/uniq 组合,但没有成功。

我有一个很长的列表,上面有时间戳和一些数字,如下所示。

[2020-09-15 09:03:21.835335] 1021
[2020-09-15 09:03:21.935335] 1021
[2020-09-15 09:03:22.835335] 1022
[2020-09-15 09:03:25.835335] 1022
[2020-09-15 09:04:21.835335] 1023
[2020-09-15 09:05:21.835335] 1023
[2020-09-15 09:04:22.835335] 1023
[2020-09-15 09:05:23.835335] 1023

在最终结果中,我想用数字处理上面第 2 列的列表。在最终处理的数据中,我想要计算第 2 列中的唯一数字(即使只出现一次),并将其添加到数字前面的新列中。我真正需要的是从数字列中最后一次出现重复/唯一条目的时间戳。

[2020-09-15 09:03:21.935335] 1021 2
[2020-09-15 09:03:25.835335] 1022 2
[2020-09-15 09:05:23.835335] 1023 4

任何帮助将不胜感激!

谢谢!

答案1

tac file | uniq -c -f 2 | awk '{$(NF+1)=$1;$1=""}1' | tac

tac以相反的顺序打印文件。这是为了保证保留最后一次出现的重复行。

uniq -c -f 2仅通过跳过前两个字段来比较最后一个字段-f 2。它在重复行的数量前面添加了-c标志,因此我们必须将计数传输到最后一个字段。就是这样awk '{$(NF+1)=$1;$1=""}1'

最后,tac将一切恢复原样。

 [2020-09-15 09:03:21.935335] 1021 2
 [2020-09-15 09:03:25.835335] 1022 2
 [2020-09-15 09:05:23.835335] 1023 4

答案2

$ awk '{map[$3]=$1" "$2; cnt[$3]++} END{for (key in map) print map[key], key, cnt[key]}' file
[2020-09-15 09:03:21.935335] 1021 2
[2020-09-15 09:03:25.835335] 1022 2
[2020-09-15 09:05:23.835335] 1023 4

上面将以随机顺序输出行,如果它们需要保留输入顺序,则需要进行一个小调整。

相关内容