2017-03-08 19 views
0

私はコード作成にかなり慣れていませんが、私はしばしばファイルをマージし、IDと情報を2つのファイルにマッチさせるためにPerlを使用します。私は今まで何度も使用していたプログラムを使って2つのファイルを照合しようとしましたが、今回は動作していません。ここ2つのファイルをマージするスクリプト

コードである:

ファイル1:

501093 0 0 3162 
2958 0 0 3163 
1895 0 0 3164 
1382 0 0 3165 
2869 0 0 3166 
2361 0 0 3167 
754  0 0 3168 
3163 0 0 3169 

ファイル2:

つの入力ファイル形式から

use strict; 
use warnings; 
use vars qw($damID $damF $damAHC $prog $hash1 %hash1 $info1 $ID $sire $dam $F $FB $AHC $FA $hash2 %hash2 $info2); 


open (FILE1, "<damF.txt") || die "$!\n Couldn't open damF.txt\n"; 
my $N = 1; 
while (<FILE1>){ 
    chomp (my $line=$_); 
    next if 1..$N==$.; 
    my ($damID, $damF, $damAHC, $prog) = split (/\t/, $line); 
     if ($prog){ 
      $hash1 -> {$prog} -> {info1} = "$damID\t$damF\t$damAHC"; 
     } 


    open (FILE2, "<whole pedigree_F.txt") || die "$!\n whole pedigree_F.txt \n"; 
    open (Output, ">Output.txt")||die "Can't Open Output file"; 

    while (<FILE2>){ 
     chomp (my $line=$_); 
     next if 1..$N==$.; 
     my ($ID, $sire, $dam, $F, $FB, $AHC, $FA) = split (/\t/, $line); 
     if ($ID){ 
      $hash2 -> {$ID} -> {info2} = "$F\t$AHC"; 
     } 
      if ($ID && ($hash1->{$prog})){ 
      $info1 = $hash1 -> {$prog} -> {info1}; 
      $info2 = $hash2 -> {$ID} -> {info2}; 
      print "$ID\t$info2\t$info1\n"; 
     } 
    } 
} 


close(FILE1); 

close FILE2; 
close Output; 

print "Done!\n"; 

及びこれらのスニペット

49327 20543 49325 0.077 0.4899 0.808 0.0484 
49328 15247 49326 0.0755 0.5232 0.8972 0.0499 
49329 27823 49327 0.0834 0.5138 0.8738 0.0541 

column 4 in file 1の値とcolumn 1 in file 2の値を一致させたいとします。

さらに、一致する値をcolumns 2 and 3 in file 1columns 3 and 5 in file 2から印刷したいとします。

また、それぞれのファイルに約のエントリがあることに言及する価値があります。それは私が作成した最初のハッシュをループされていないことを

11476 0.0362 0.3237 501093 0 0 
11477 0.0673 0.4768 501093 0 0 
11478 0.0443 0.2619 501093 0 0 

注:

この

は私が取得しています出力されます。

+2

何が問題になりますか? 2番目のファイル名のスペースが物事を投げ捨てる可能性はありますか?何かエラーがありますか? – Ilion

+0

希望の出力を追加してください – dawg

+0

最初のハッシュはループしていないようです。それはほとんどの場合、vars qw()のように思えます。ファイルで作業していません – user7675703

答えて

1

SQLiteで2つのテーブルを作成します。それらにTSVをロードします。 SQL結合を行います。それはより簡単で速くなります。

Refer to this answer about how to load data into SQLite。あなたの場合、.mode tabsが必要です。

sqlite> create table file1 (col1 int, col2 int, col3 int, col4 int); 
sqlite> create table file2 (col1 int, col2 int, col3 int, col4 numeric, col5 numeric, col6 numeric, col7 numeric); 
sqlite> .mode tabs 
sqlite> .import /path/to/file1 file1 
sqlite> .import /path/to/file2 file2 

これらのテーブルを改善する方法はいくつもありますが、自分のデータが何であるか分かりません。あなた自身でより良い名前を使用してください。また、プライマリキーと外部キーのようなものを宣言し、遅くするためにindexesを宣言したいと思うでしょう。

これで、カスタムコードの束ではなく、よく知られたクエリ言語を使用して、データを簡単に操作できる形式にしました。ファイル内の

Iカラム1と、ファイル1の列4からの値と一致する2

そしてIはまた、ファイル1のカラム2及び3からマッチング値を印刷したいですそして、ファイル内の列3と5は2

は、次の2つのテーブル間SQL joinでこれを行うことができます。

select file1.col2, file1.col3, file2.col3, file2.col5 
from file1 
join file2 on file1.col4 = file2.col1 
関連する問題