我需要一些帮助来在 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
上面将以随机顺序输出行,如果它们需要保留输入顺序,则需要进行一个小调整。