Несколько строк имеют общее значение в столбце. Как мне поместить все эти строки в одну строку? - PullRequest
0 голосов
/ 12 ноября 2009

Я работаю с текстовым файлом, который выглядит примерно так:

rs001  EEE /n
rs008  EEE /n
rs345  EEE /n
rs542  CHG /n
re432  CHG /n

Я хочу иметь возможность свернуть все строки, имеющие одинаковое значение в столбце 2, в одну строку (например, rs001 rs008 rs345 EEE). Есть ли простой способ сделать это с помощью обработки текста Unix или Python?

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009
#!/usr/bin/env python
from __future__ import with_statement
from itertools import groupby
with open('file','r') as f:
    # We define "it" to be an iterator, for each line
    # it yields pairs like ('rs001','EEE') 
    it=(line.strip().split() for line in f)
    # groupby does the heave work.
    # lambda p: p[1] is the keyfunction. It groups pairs according to the
    # second element, e.g. 'EEE'
    for key,group in groupby(it,lambda p: p[1]):
        # group might be something like [('rs001','EEE'),('rs008','EEE'),...]
        # key would be something like 'EEE', the value that we're grouping by.
        print('%s %s'%(' '.join([p[0] for p in group]),key))
0 голосов
/ 12 ноября 2009

вот вам таращить глаза

$ awk '{a[$2]=a[$2]FS$1}END{for(i in a)print i,a[i]}' file
EEE  rs001 rs008 rs345
CHG  rs542 re432
0 голосов
/ 12 ноября 2009

Один из вариантов - создать словарь на основе данных столбца 2:

from collections import defaultdict  #defaultdict will save a line or two of code

d = defaultdict(list)  # goal is for d to look like {'EEE':['rs001', 'rs008', ...
for line in file('data.txt', 'r'):
    v, k = line.strip().split()
    d[k].append(v)

for k, v in d.iteritems():  # print d as the strings you want
    print ' '.join(v+[k])

Преимущество этого подхода состоит в том, что он не требует, чтобы термины столбца 2 были сгруппированы вместе (хотя вопрос о том, является ли столбец 2 предварительно сгруппированным, прямо не указан в вопросе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...