如果等于之前的行,则从控制台跳过行,添加计数(实时)

如果等于之前的行,则从控制台跳过行,添加计数(实时)

使用 uniq 可以过滤掉连续的重复行。

while (true) do echo 1; echo 2; echo 2; echo 1; sleep 1; done | uniq

变成:

1
2
1

有没有办法删除重复的连续行,同时添加重复次数?例如在上面的例子中

1
2 (2)
1

如果新的“1”行到达,上面的内容应该变成:

1
2 (2)
1 (2)

这不是针对文件,而是针对流(例如 tail -f),其中实时添加新行。

答案1

您不再删除重复项,而是对它们进行计数。

awk '{ if (h[$0]++) { s=" (" h[$0] ")" } else { s="" }; printf "%s%s\n", $0, s }'

该数组h[]跟踪输入(当前行是$0)。如果该值大于 1,它将与当前行一起打印。

唯一的行集保存在内存中,因此,如果您有一个大型数据集,并且重复行相对较少,那么您最终会将大部分数据集保存在 RAM 中(或者最多保存在交换中)。在构建解决方案时请注意这一点。

1对于lines , 2, 2,的输入13您将得到以下输出:

1
2
2 (2)
1 (2)
3

如果输入流是有限的(不是您的示例或建议的情况tail -f),那么我们可以收集所有值并输出它们及其计数。但事实并非如此,所以我们不能。

相关内容