【问题标题】:Print most frequent line and remove duplicates打印最频繁的行并删除重复项
【发布时间】:2013-08-12 18:54:26
【问题描述】:

我一直在尝试打印最常见的行并删除与第一个字段中有很多不同值的大文件中的制表符分隔的键值有关的重复项;

示例输入:

a|gofortheeyeboo    0.61
a|gofortheeyeboo    0.81
a|gofortheeyeboo    0.81
a|gofortheeyeboo    0.81
a|gofortheeyeboo    0.81
a|gofortheeyeboo    0.81
a|gofortheeyeboo    0.91
a|gofortheeyeboo-gone   0.07
a|gofortheeyeboo-gone   0.07
a|gofortheeyeboo-abouttogone    0.61
a|gofortheeyeboo-abouttogone    0.12
b|attaack-attack        0.07

不同键的期望输出:

a|gofortheeyeboo    0.81
a|gofortheeyeboo-gone   0.07
a|gofortheeyeboo-abouttogone    0.61
a|gofortheeyeboo-abouttogone    0.12
b|attaack-attack        0.07

到目前为止,在第二个制表符分隔的字段中管理了 最大值 的输出,删除了重复项;

awk -F '\t' '{ if (l[$1] <= $2) l[$1] = $2} END {for (i in l) print i"\t"l[i];}'

上面不需要的命令的输出;

a|gofortheeyeboo        0.91
a|gofortheeyeboo-abouttogone    0.61
b|attaack-attack        0.07
a|gofortheeyeboo-gone   0.07

【问题讨论】:

  • 试试uniqhead怎么样?
  • 这是一个大文本文件。不幸的是,不是关于嘘声。

标签: unix awk


【解决方案1】:
sort input | uniq -c | sort -nr | \
       awk 's[$2] == $1 { print $2,$3} !s[$2] { print $2,$3; s[$2]=$1; }'

【讨论】:

    【解决方案2】:
    keys = {}
    
    for line in sys.stdin:
        line = line.strip()
    
        k, v = line.split('\t')
    
        if k in keys:
            if v in keys[k]:
                keys[k][v] += 1
            else:
                keys[k][v] = 1
        else:
            keys[k] = {v: 1}
    
    for k in keys:
    
        items = keys[k].items()
    
        # Some pair emerged more than once
        if any(map(lambda x: x[1] > 1, items)):
            # Calucalte max frequence
            freq = reduce(
                lambda acc, e: acc if acc[1] > e[1] else e, 
                items
                )[0]
            print '{0}\t{1}'.format(k, freq)
        # None pair emereged more than once
        else:
            # Print every pair
            for v in items:
                print '{0}\t{1}'.format(k, v[0])
    

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多