2

私はファイルを持っています:

1 Chr1       100820415  
1 Chr1       100821817  
1 Chr1       100821818  
1 Chr1       100823536  
1 Chr1       100824427  
2 Chr1       100824427  
2 Chr1       100824427  
1 Chr1       100824428

すべての列 2 が同じで、列 3 の値が同じである場合、列 1 の値を追加しようとしています。それは一種の「クラスタリング」のようなものです。

したがって、出力は次のようになります。

1 Chr1       100820415  
1 Chr1       100821817  
1 Chr1       100821818  
1 Chr1       100823536  
5 Chr1       100824427
1 Chr1       100824428

私はawkその言語を初めて使用し、理解しようとしていますが、そのスクリプトを書くとは言えませんif $2 is same then add $1 and if $2 is same then add $3 values (if $3 values are same)

これまでに試したことは次のとおりです。

awk 'BEGIN{ x+=$1 } END {print x} if NF == $2' file_name

解は inawkまたはのいずれかになりますpython

4

4 に答える 4

1

まさにあなたが望むもの:

import re
from collections import defaultdict

d = defaultdict(int)

with open('file.txt') as f:
    for line in f:
        qty, chr, _id = re.split('\s+', line.strip())
        d[(_id, chr)] += int(qty)

for (_id, chr), qty in d.iteritems():
    print '{} {}       {}'.format(qty, chr, _id)
于 2013-10-02T19:15:14.657 に答える
0

ここに Python バージョンがあります。

stdin から入力を読み取ります。

注: 2 番目の列が常にChr1であると想定し、最後の列の値でソートされた出力を保持します。入力の順序は保持されません。

#!/usr/bin/env python2.7
import sys

# Maps a 'value' to its count
counter = {}

for line in sys.stdin:
    num, tag, value = line.split()
    num = int(num)
    counter[value] = counter.setdefault(value, 0) + num

for value in sorted(counter.keys()):
    print counter[value], 'Chr1', value
于 2013-10-02T18:29:34.577 に答える