0

最初のフィールドに多くの異なる値がある大きなファイルで、最も頻繁に使用される行を印刷し、タブで区切られたキー値に関する重複を削除しようとしました。

入力例:

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

これまでのところ、 2 番目のタブ区切りフィールドで最大値の出力を取得して、重複を削除することができました。

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
4

2 に答える 2

1
sort input | uniq -c | sort -nr | \
       awk 's[$2] == $1 { print $2,$3} !s[$2] { print $2,$3; s[$2]=$1; }'
于 2013-08-07T01:11:55.733 に答える
-1
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])
于 2013-08-12T10:54:26.447 に答える