更新(16/1/13)
ボロディンは、私が完全に見落としていた別の可能性を指摘しました。実際の
ファイル(手動で座って、それぞれ約 10MB の 46 個のファイルを調べ始めました) では、 File1 の特定の値に対して、File2に小さい値が存在しない場合があります(ただし、大きい値は存在します)。
同様に、 File1 の特定の値に対して、より大きな値がFile2に存在しない場合があります(ただし、より小さな値は存在します) 。
この更新を反映するために、ここでサンプル ファイルと目的の出力を更新しています。
更新 (15/1/13)
File1 の値がFile2の値と一致する場合を考慮して、目的の出力を更新しました。そのようなシナリオを指摘してくれたボロディンに感謝します。
次のような 2 つのファイルがあります。
ファイル1
chr1 10227
chr1 447989
chr1 535362
chr1 856788
chr1 249240496
ファイル2
chr1 11017
chr1 11068
chr1 23525
chr1 439583
chr1 454089
chr1 460017
chr1 544711
chr1 546239
chr1 856788
chr1 249213429
chr1 249214499
chr1 249239072
私がする必要があるのは、file1の foreach 値です。、 file210227
から検索、最も 近い2 つの値。これらの値の 1 つが大きくなり、もう 1 つが小さくなります。したがって、file1を取り込むと、 file2で最も近い値はとです。ここで、次のような出力 (タブ区切り) を得るために、差を計算する必要があります。10227
9250
11017
9250 - 10227
-977
11017 - 10227
790
望ましい出力
chr1 10227 No 790 No Match
chr1 447989 No 6100 -8406
chr1 535362 No 9349 -75345
chr1 856788 Yes
chr1 249240496 No No Match -25997
これを行う最速の方法は、ハッシュを使用して2つのファイルを読み込み、数値を値としてkeys
代入することだと考えました1
。
私がこれまでに書いたコードは、 file210227
のすべての値との違いを示しています。と も同様です。これを停止して、最も近い数字のみの違いを見つけるにはどうすればよいですか。1 つは >で、1 は < です。447989
535682
10227
10227
コード
use 5.014;
use warnings;
#code to enter lsdpeak and pg4 data into hash with KEYS as the numerical values, VALUE as 1
#Assign filename
my $file1 = 'lsdpeakmid.txt';
my $file2 = 'pg4mid.txt';
#Open file
open my $fh1, '<', $file1 or die $!;
open my $fh2, '<', $file2 or die $!;
#Read in file linewise
my %hash1;
while(<$fh1>){
my $key1 = (split)[1];
$hash1{$key1} = 1;
}
my %hash2;
while(<$fh2>){
my $key2 = (split)[1];
}
foreach my $key1 (sort keys %hash1){
foreach my $key2 (sort keys %hash2){
say $key2-$key1;
}
}
#Exit
exit;
問題を解決するために時間を割いていただきありがとうございます。すべてのコメント/回答に感謝します。