##################################
#                                #
# Last modified 03/27/2012       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import math

def run():

    if len(sys.argv) < 6:
        print 'usage: python %s filename IDfieldID(s) filename2 IDfieldID(s) datafieldID(s) outputfilename'
        print 'the script will take the values in the data fields from file2 and attach them as last columns to file1 using the indicated field IDs as tracking identifiers'
        print 'field IDs comma-separated'
        sys.exit(1)
    
    file1 = sys.argv[1]
    IDs = sys.argv[2].split(',') 
    file1fieldIDs = []
    for ID in IDs:
        file1fieldIDs.append(int(ID))
    file2 = sys.argv[3]
    IDs = sys.argv[4].split(',') 
    file2fieldIDs = []
    for ID in IDs:
        file2fieldIDs.append(int(ID))
    IDs = sys.argv[5].split(',') 
    datafieldIDs = []
    for ID in IDs:
        datafieldIDs.append(int(ID))
    datafieldIDs.sort()
    file2fieldIDs.sort()
    file1fieldIDs.sort()
    outfilename = sys.argv[6]

    DataDict={}

    listoflines = open(file2)
    for line in listoflines:
        if line[0]=='#':
            continue
        fields=line.split('\n')[0].split('\t')
        label = []
        for ID in file2fieldIDs:
            label.append(fields[ID])
        label=tuple(label)
        data = []
        for ID in datafieldIDs:
            data.append(fields[ID])
        DataDict[label]=data

    outfile = open(outfilename, 'w')

    listoflines = open(file1)
    for line in listoflines:
        if line[0]=='#':
            outfile.write(line)
            continue
        fields=line.split('\n')[0].split('\t')
        label = []
        for ID in file1fieldIDs:
            label.append(fields[ID])
        label=tuple(label)
        data = DataDict[label]
        outline = line.split('\n')[0]
        for d in data:
            outline = outline + '\t' + d
        outfile.write(outline + '\n')

    outfile.close()
   
run()
