2010-12-23 10 views
2

Was ist die einfachste Methode zum Verbinden/Zusammenführen aller Dateien in einem Ordner (tabulatorgetrennt) in eine einzige Datei? Sie alle teilen sich eine eindeutige Spalte (Primärschlüssel). Eigentlich muss ich nur eine bestimmte Spalte und einen Link für diesen Primärschlüssel kombinieren, sodass die Ausgabedatei für jede Datei eine neue Spalte enthält. Ex:Zusammenführen von tabulatorgetrennten Textdateien in eine einzige Datei

KEY# Ratio1 Ratio2 Ratio3 
1  5.1  4.4  3.3 
2  1.2  2.3  3.2 
etc.... 

Es gibt viele andere Spalten in jeder Datei, die ich brauche nicht in der Ausgabedatei zu kombinieren, ich brauche nur diese „ratio“ Spalten durch die eindeutigen Schlüsselspalt verknüpft.

Ich verwende OS X Snow Leopard, habe aber Zugriff auf einige Linux-Maschinen.

Antwort

2

Ich habe tatsächlich einige Zeit Perl lernen und löste das Problem auf eigene Faust. Ich dachte, ich würde den Quellcode teilen, wenn jemand ein ähnliches Problem zu lösen hat.

#!/usr/bin/perl -w 

#File: combine_all.pl 
#Description: This program will combine the rates from all "gff" files in the current directory. 

use Cwd; #provides current working directory related functions 
my(@handles); 

print "Process starting... Please wait this may take a few minutes...\n"; 

unlink"_combined.out"; #this will remove the file if it exists 

for(<./*.gff>){ 
    @file = split("_",$_); 
    push(@files, substr($file[0], 2)); 
    open($handles[@handles],$_); 
} 

open(OUTFILE,">_combined.out"); 

foreach (@files){ 
    print OUTFILE"$_" . "\t"; 
} 

#print OUTFILE"\n"; 

my$continue=1; 

while($continue){ 
    $continue=0; 

    for my$op(@handles){ 
    if($_=readline($op)){ 
     [email protected]=split; 
     if($col[8]) { 
     $gibberish=0; 
     $col[3]+=0; 
     $key = $col[3]; 
     $col[5]+=0; #otherwise you print nothing 
     $col[5] = sprintf("%.2f", $col[5]); 
     print OUTFILE"$col[5]\t"; 
     $continue=1; 
     } else { 
     $key = "\t"; 
     $continue=1; 
     $gibberish=1; 
     } 
    }else{ 
     #do nothing 
    } 
    } 
    if($continue != 0 && $gibberish != 1) { 
    print OUTFILE"$key\n"; 
    } else { 
    print OUTFILE"\n"; 
    } 
} 
[email protected]; #closes all files 
close(OUTFILE); 

print "Process Complete! The output file is located in the current directory with the filename: _combined.out\n"; 
2

verwenden, um den join(1) Dienstprogramm

+0

Ich habe mit diesem Dienstprogramm untersucht, aber festgestellt, dass es für die Kombination von zwei Dateien, nicht alle Dateien in einem Ordner ist. Ich bin mir nicht sicher, wie ich dieses Tool nutzen könnte, ohne ein gutes Stück Code zu schreiben, damit es richtig funktioniert. – DaRkMuCk