使用 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
,的输入1
,3
您将得到以下输出:
1
2
2 (2)
1 (2)
3
如果输入流是有限的(不是您的示例或建议的情况tail -f
),那么我们可以收集所有值并输出它们及其计数。但事实并非如此,所以我们不能。