2013-02-07 7 views
-3

Je souhaite extraire des données d'un fichier nommé data.txt en fonction du contenu d'un autre fichier nommé list.txt. Je dois extraire $ 11 de data.txt, si le $ 1 et $ 2 de list.txt disponible dans data.txt. $ 2 de list.txt et $ 4 de data.txt sont identiques.extraction de colonnes à partir de fichiers texte

contents of list.txt 

2aas p0877 
asds k9876 
651a kl098 

contents of data.txt 

2aas F DNK_ECTHA Q9XT6 12-208 192.0 250.0 198.0 104.00 78.80 99.0 108.0 97 5 
asds G DNK_DROME k9876 12-209 192.0 250.0 197.0 100.00 78.80 87.0 100.0 97 6 
1ot3 H DNK_DROME Q9bt6 11-208 142.0 256.0 194.0 106.00 78.80 97.0 100.0 97 5 
651a H DNK_ECTHA kl098 10-208 192.0 259.0 197.0 100.00 78.80 98.0 100.0 99 5 
2aas H pyp_DROME p0877 12-208 192.0 250.0 130.0 102.00 78.80 67.0 103.0 97 9 

desired output 

2aas p0877 67.0 
asds k9876 87.0 
651a kl098 98.0 
+4

Il serait utile si vous montrez ce que vous avez déjà essayé. Nous pouvons alors vous fournir des conseils plus ciblés, et il ne semblera pas que vous demandiez simplement que d'autres fassent votre travail pour vous. –

+0

python + awk = noway – Denis

Répondre

1

Je suppose data.txt contient une liste de données que vous souhaitez « requête » en utilisant les entrées de list.txt

Voici une approche rapide et sale en utilisant python:

# Create a data dict using data.txt 
with open("data.txt") as f: 
    # create generator of entries using non-empty lines in file 
    entries = (line.split() for line in f if line.strip()) 
    # create dict using ($1,$4) as key and $11 as value 
    data = dict(((d[0], d[3]), d[10]) for d in entries) 

# for each entry in list.txt, print out matching data 
with open("list.txt") as f: 
    entries = (tuple(line.split()) for line in f if line.strip()) 
    for e in entries: 
    if e in data: 
     print e[0], e[1], data[e] 

Course à dans le même répertoire que les fichiers donne:

[[email protected]]$ python extract.py 
2aas p0877 67.0 
asds k9876 87.0 
651a kl098 98.0 

Ou, pour une solution awk:

[[email protected]]$ awk 'FILENAME==ARGV[1] {pair[$1" "$4] = $11; next} ($1" "$2 in pair) {printf("%s\t%s\t%s\n", $1, $2, pair[$1" "$2])}' data.txt list.txt 
2aas p0877 67.0 
asds k9876 87.0 
651a kl098 98.0 
Questions connexes