2009-11-12 7 views
0

Je travaille avec un fichier texte qui ressemble à ceci:Plusieurs lignes partagent une valeur dans une colonne, comment puis-je mettre toutes ces lignes dans une seule ligne?

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

Je veux être en mesure de s'effondrer toutes les lignes qui partagent la même valeur dans la colonne 2 en une ligne unique (par exemple, rs001 rs008 rs345 EEE). Y at-il un moyen facile de le faire en utilisant un traitement de texte Unix ou python?

Merci

Répondre

2
#!/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

Une option consiste à construire un dictionnaire calée sur la colonne 2 données:

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]) 

Cette approche a l'avantage qu'il ne nécessite pas la colonne 2 termes être regroupés (bien que la colonne 2 ne soit pas pré-groupée n'est pas directement spécifiée dans la question).

0

Voici ce gawk pour vous

$ awk '{a[$2]=a[$2]FS$1}END{for(i in a)print i,a[i]}' file 
EEE rs001 rs008 rs345 
CHG rs542 re432 
Questions connexes