0

少し不具合が発生しました。次のような2つのファイルがあります。

ファイル1

chr10   179423  181499  181423  2076    +   NM_001202464    ZMYND11
chr10   693887  696118  695887  2231    +   NR_027151   C10orf108
chr10   694016  696382  696016  2366    +   NR_027152   C10orf108
chr10   1032348 1034467 1034348 2119    +   NM_012341   GTPBP4
chr10   1203707 1205930 1205707 2223    +   NR_015376   LINC00200

ファイル2

chr10   176225
chr10   180990
chr10   181315
chr10   181529
chr10   181695
chr10   182183
chr10   686673
chr10   686699
chr10   688273
chr10   695323
chr10   698323
chr10   722737
chr10   906075
chr10   908409
chr10   928052
chr10   950429
chr10   989722
chr10   1006348
chr10   1010731
chr10   1020229
chr10   1034526
chr10   1064089
chr10   1103000
chr10   1103198
chr10   1103267
chr10   1114980
chr10   1135327
chr10   1150625
chr10   1193412
chr10   1193677
chr10   1199817
chr10   1212181
chr10   1212310
chr10   1216875
chr10   1218919
chr10   1226134
chr10   1226254

必要なもの

行ごとに、すべての4th elementfrom からFile1値を出力しますFile2>= 2nd element from file1 & <= (4th element from file1+2000)

たとえば、File1の 4 番目の要素row1181423です。からFile2>= 2nd element from file1 (179423)<= 4th element from file1+2000(183423)の値は 18090、181315、181529、181695、182183 です。

値が見つからない場合は、NA出力する必要があります。

望ましい出力

次のようなタブ区切りファイル。

chr10   179423  181423  183423  NM_001202464    ZMYND11     180990
                                                            181315
                                                            181529
                                                            181695
                                                            182183
chr10   693887  695887  697887  NR_027151   C10orf108       695323
chr10   694016  696016  698016  NR_027152   C10orf108       695323
chr10   1032348 1034348 1036348 NM_012341   GTPBP4          1034526
chr10   1203707 1205707 1207707 NR_015376   LINC00200       NA  

マイコード

私はそれについてどうやって行くかについて全く無知です。最初に、との要素のfile2間にある値を見つけるだけでよいと言われました。そのために、ハッシュを使用して次のコードを作成しましたが、これは機能していましたが、完全な仕事をしていませんでした。(ループ内の部分は、私が思っていたとおりに動作していないため、より大きな値がすべて出力されています) 2nd4thfile1&&if

これで、このコードは完全に役に立たなくなりました:/ Perl プログラミングを始めて 3 か月以内に狡猾なプログラムを書けるようになるかどうかわからないので、頭がいっぱいです。

use 5.014;
use warnings;

#Assign filenames
my $file1 = 'file1.txt' || die $!; #File with TSS coordinates
my $file2 = 'file2.txt' || die $!; #File with G4 coordinates

#Open files
open my $fh1, '<' , $file1 || die $!;
open my $fh2, '<' , $file2 || die $!;

#Open output
open OUT, ">G4_coordinates_promoters$file1.out" || die $!;

#Read files
while (<$fh1>) {
    chomp;
    my %data1; #Hash for TSS
    my ($key1, $val1) = (split) [1,3];
    $data1{$key1} = $val1;
    while (<$fh2>) {
        chomp ;
        my %data2; #Hash for G4 coordinates
        my ($key2, $val2) = (split) [1,2];
        $data2{$key2} = $val2;

        #Compare hashes
        if ( ($key2 > $key1) && 
             ($key2 << $data1{$key1})){ #Here the code after && is NOT working
            say OUT $key2
        }
    }
} 

私の問題を解決していただきありがとうございます。この問題にアプローチするための簡単な方法が見つかれば幸いです。

4

1 に答える 1

3

このプログラムは、必要なことを行うようです。

出力は入力データと同じタブ区切り形式で書き込まれるため、継続行には正しい数のタブがありますが、最初の行と物理的に整列していません。違うものが欲しい場合は、そのように言ってください。

のすべての値file2が配列に取り込まれ@file2、そこから処理されます。コードは、値が既にソートされていることを前提としていました。

while (<$fh>) {
  chomp;
  my @fields = split /\t/;

  my $min = $fields[1];
  my $max = $fields[3] + 2000;

  my @values;
  for my $val (@file2) {
    last if $val > $max;
    push @values, $val if $val >= $min;
  }
  push @values, 'NA' unless @values;

  for my $val (@values) {
    print join("\t", @fields, $val), "\n";
    $_ = '' for @fields;
  }
}

出力

chr10 179423  181499  181423  2076  + NM_001202464  ZMYND11 180990
                181315
                181529
                181695
                182183
chr10 693887  696118  695887  2231  + NR_027151 C10orf108 695323
chr10 694016  696382  696016  2366  + NR_027152 C10orf108 695323
chr10 1032348 1034467 1034348 2119  + NM_012341 GTPBP4  1034526
chr10 1203707 1205930 1205707 2223  + NR_015376 LINC00200 NA
于 2013-03-07T11:09:31.030 に答える