【问题标题】:Duplicates in column: randomly keep one列中重复:随机保留一个
【发布时间】:2018-03-16 14:42:51
【问题描述】:

我有一个文件 (input.txt),其结构类似于:

 abc    1
 bcd    a
 cde    1
 def    4
 efg    a
 fgh    3

我想删除第 2 列中的重复项,以便该列中只有唯一的字符串(独立于第 1 列中的内容)。但是选择的行应该是随意选择的。输出可能例如是:

 bcd    a
 cde    1
 def    4
 fgh    3

我尝试创建一个列出重复项的文件(使用awk '{print $2}' input.txt | sort | uniq -D | uniq),但后来我只设法使用awk '!A[$2]++' 将它们全部删除,而不是随机保留其中一个重复项。

【问题讨论】:

  • awk '!A[$2]++' file有什么问题
  • 如果第 2 列中有重复项,awk '!A[$2]++' file 会删除该行。但我想在文件中保留一次重复出现(以随机方式)。

标签: bash awk duplicates multiple-columns


【解决方案1】:

预处理输入以使其随机化:

shuf input.txt | awk '!A[$2]++'

【讨论】:

  • ^1 非常好的方法!
  • 如此简单,它工作得非常好。谢谢@William!
【解决方案2】:

使用 GNU awk 实现真正的多维数组:

$ awk '{a[$2][++cnt[$2]]=$0} END{srand(); for (k in a) print a[k][int(rand()*cnt[k])+1]}' file
 efg    a
 cde    1
 fgh    3
 def    4

与其他 awks:

$ awk '{keys[$2]; a[$2,++cnt[$2]]=$0} END{srand(); for (k in keys) print a[k,int(rand()*cnt[k])+1]}' file
 bcd    a
 abc    1
 fgh    3
 def    4

【讨论】:

    【解决方案3】:

    perl

    $ perl -MList::Util=shuffle -e 'print grep { !$seen{(split)[1]}++ } shuffle <>' input.txt
     def    4
     fgh    3
     bcd    a
     abc    1
    
    • -MList::Util=shuffleList::Util 模块中获取shuffle 函数
    • shuffle &lt;&gt; 此处 &lt;&gt; 将所有输入行作为数组获取,然后被打乱
    • grep { !$seen{(split)[1]}++ } 以空格为分隔符,根据每个数组元素的第二个字段过滤行


    ruby

    $ ruby -e 'puts readlines.shuffle.uniq {|s| s.split[1]}' input.txt
     abc    1
     bcd    a
     fgh    3
     def    4
    
    • readlines 将从输入文件中获取所有行作为数组
    • shuffle 随机化元素
    • uniq 获取独特元素
      • {|s| s.split[1]} 基于第二个字段值,使用空格作为分隔符
    • puts 打印数组元素

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2014-10-17
      • 2018-09-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多