【问题标题】:Extract only two matches per unique line and discard more than 3 duplicates每个唯一行仅提取两个匹配项并丢弃超过 3 个重复项
【发布时间】:2017-12-27 23:39:28
【问题描述】:

我想提取最多出现 2 次的名称。在第 1 列。如果它出现超过 2 次,那么我只需要获得前 2 次。 例如。 文件1.txt

10000040 1-120 10000040 541-660 10000040 91-210 10000042 1-120 10000043 541-660 10000048 1-120 10000049 1-120 10000049 181-300 10000049 271-390 10000049 361-480

从上面的文件中,我想要这样的东西: 10000040 1-120 10000040 541-660 10000042 1-120 10000043 541-660 10000048 1-120 10000049 1-120 10000049 181-300

我已经尝试过 uniq 和 -D 但它们没有给出我想要的。 感谢您的帮助。

【问题讨论】:

  • -m 标志呢? grep -m 2 '10000040 1-120' yourfile.txt
  • 为什么10000040只出现一次?

标签: linux awk grep uniq


【解决方案1】:
awk '++_[$1] < 3' input_file

ctac_answer的缩短版

【讨论】:

  • 永远不要为变量命名_ - 这比单个字母名称更糟糕,并且增加了绝对零值,它唯一的影响是负面的。
  • 我认为它是一个丢弃变量,因为它不再被使用,但你有权发表你的意见
  • 好的,但是_[]a[] 有什么好处,至少可以让您知道您正在处理一个变量并且它是一个数组?
  • 在我看来没有优势或劣势。您更喜欢看到某种字母或单词的事实是一种偏好。我经常使用这种格式来查找列表中的唯一项目,也就是说,这只是我的偏好:)
【解决方案2】:

使用 awk

awk '{a[$1]++}a[$1]<3{print}' infile

【讨论】:

  • '{a[$1]++}a[$1]&lt;3{print}' = '++a[$1]&lt;3'
  • 谢谢。那行得通。 @grail 的解决方案要短得多,而且似乎完成了我想要的工作。
猜你喜欢
  • 2015-01-04
  • 2016-10-08
  • 2016-02-12
  • 2018-10-05
  • 1970-01-01
  • 2020-01-04
  • 2015-01-13
  • 2013-06-15
  • 2017-07-24
相关资源
最近更新 更多