【问题标题】:How do you filter out all unique lines in a file?如何过滤掉文件中的所有唯一行?
【发布时间】:2013-03-25 17:09:22
【问题描述】:

有没有办法通过命令行工具过滤掉文件中所有唯一的行而不对行进行排序?我想基本上这样做:

sort -u myFile

没有排序的性能影响。

【问题讨论】:

  • 渐近地,重复删除的下限是 O(nlogn)。
  • @gongzhitaao:仅限于固定空间时。使用哈希表可以在 O(n) 时间内删除重复项,但需要花费 O(n) 空间。
  • @chepner 完全正确。似乎甚至可以通过使用哈希表来实现-u 标志,从而导致sort 跳过排序。
  • 或者至少最后进行排序。

标签: linux bash shell command-line


【解决方案1】:

删除重复的行:

awk '!a[$0]++' file

这就是著名的 awk one-liner。 inet上有很多解释。 Here 是一种解释:

这个单行是非常惯用的。它记录了在 associative-array "a"(数组在 Awk 中总是关联的)并且在 同时测试它之前是否看过这条线。如果它看到了 行前,然后 a[line] > 0 和 !a[line] == 0。任何表达式 计算结果为 false 是无操作,任何计算结果为 true 的表达式 等于“{ print }”。

【讨论】:

  • 确实,这太棒了!提醒我应该开始学习awk
  • @hek2mgl uniq 需要先排序。 awk 没有。 OP 清楚地写了有问题的要求without sorting the lines
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多