2015-02-13 4 views
2

У меня есть одна таблица связанных результатов маркера и одна таблица маркеров болезни. Оба файла имеют заголовки.Perl выводит слишком много столбцов

Это то, что связано маркер таблица выглядит следующим образом:

snps_BCG24 gene_BCG24 statistic_BCG24 pvalue_BCG24 FDR_BCG24 beta_BCG24     pair SharedOrUnique_BCG24 PercentileRank_BCG24 chr  cM hg19pos Diseasegene 
rs11203184 C21orf128  -9.425704 4.008530e-12 2.501741e-05 -0.9199033 rs11203184_C21orf128  SharedSignalMO7   1.484874e-06 21 63.4452 43526430 notDiseasegene 
rs11203184  C2CD2  2.290434 2.684575e-02 8.559484e-01 0.3114964  rs11203184_C2CD2 UniqueSignalBCG24   2.906046e-01 21 63.4452 43526430 notDiseasegene 

Это то, что таблица маркер заболевания выглядит следующим образом:

Chr hg19Pos hg18Pos  rsID   SNPname    hg19UCSC    hg18UCSC startLoc endLoc 
1 1247494 1237357 rs12103 var_chr1_1247494 chr1:1247494-1247494 chr1:1237357-1237357 1147494 1347494 
1 2502780 2492640 rs6667605 var_chr1_2502780 chr1:2502780-2502780 

Если ассоциированные маркеры и маркеры заболевания находятся на той же хромосомы (связанный столбец 9 == столбец болезни 0, соответственно), я тогда хочу проверить, находится ли позиция моего ассоциированного маркера (столбец 11 в связанной таблице) в начальной и конечной позиции маркеров болезни (столбцы 7 и 8 в таблица болезни).

Если мои соответствующие маркеры находятся на этом расстоянии, я хочу пометить соответствующий маркер "inLocus", в противном случае оставьте пустым. Результатом вывода будет файл с двумя столбцами с разделителями табуляции: 1) имя каждого связанного маркера в том же порядке, что и соответствующая таблица маркеров 2) inLocus, или пустое состояние для каждого маркера в соответствующей таблице маркеров.

Я написал для этого сценарий perl, но вместо вывода двух столбцов (один для ассоциированного имени маркера и один для статуса локуса) он выводит один столбец с именем маркера и различным числом столбцов для части "inLocus" - и не всегда одинаковое количество столбцов. Я не знаю, какой маркер действительно "inLocus", потому что каждый выходной столбец иногда имеет другой статус. Что мне нужно изменить в моем коде, чтобы каждый маркер в моем списке получил окончательный лейбл inLocus? Будет ли изменение пустым для печати "notLocus" изменить ситуацию? Вот мой код:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $data_file1="/Users/Me/AssociatedMarkers.txt"; 
my $data_file2="/Users/Me/DiseaseMarkers.txt"; 
open(Main, $data_file1) || die("Could not open file!"); 

my $Line = 0; 
my $Line1 = 0; 
my @main = 0; 
my @loci = 0; 

#Generate output files 
open(Result, ">AssociatedMarkersInLocus.txt"); 
print Result "SNP\tinLocus?\n"; 
foreach $Line (<Main>) { 
    #remove new line character 
    open(DiseaseMarkers, $data_file2) || die("Could not open file!"); 
    $Line =~ s/[\n\r]//g; 
    @main = split(/\t/,$Line); 
    print Result "@main[0]"; 
    foreach $Line1 (<DiseaseMarkers>) { 
     $Line1 =~ s/[\n\r]//g; 
     @loci = split(/\t/,$Line1); 
     if ((@main[9] eq @loci[0])&&(@main[11]>[email protected][7])&&(@main[11]<@loci[8])){ 
      print Result "\tinlocus"; 
      close(DiseaseMarkers); 
     } 
    } 
print Result "\n"; 
} 
close(Result); 
#Report completion 
print "Program AssociatedMarkers finished. \n"; 

Вот результаты я получаю:

SNP inLocus?     
MarkerNameHeader 
MarkerName1 inLocus  inLocus  inLocus 
MarkerName2 
MarkerName3    inLocus 
MarkerName4 inLocus  inLocus  inLocus 
MarkerName5 inLocus 

Вот формат результатов я на самом деле нужно:

MarkerName1 inLocus 
MarkerName2 
MarkerName3 
MarkerName4 inLocus 

С другой стороны, если кто-то знает, как чтобы добавить информацию inLocus в мой существующий файл AssociatedMarkers, это было бы еще лучше!

+1

без ввода пробы, мы не можем попробовать что-нибудь. – choroba

+0

Спасибо, я добавил примеры обоих входных файлов к моему вопросу. – user3482899

ответ

5

испытаний с образцами данных, казалось, хорошо ..

Немного Код обзора:

  1. Объявите переменные, как это необходимо. Глобалы могут запутаться.
  2. Использования лексический контекстное переменные как файл обрабатывает
  3. использовать три открытых параметры
  4. Попытки закрыть дескриптор внутри цикла, вероятно, не то, что вы хотели сделать. Я переместил несколько областей
  5. last LINE сломает вас из DiseaseMarkers файла
  6. @foo[0] должен быть $foo[0]

Приятно видеть, что вы не используете chop/chomp! Я исправил ваши регулярные выражения, чтобы быть еще более портативными.

Во всяком случае, это должно исправить:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $data_file1 = "/Users/Me/AssociatedMarkers.txt"; 
my $data_file2 = "/Users/Me/DiseaseMarkers.txt"; 

#Open data file and create file handle 
open(my $mainfh, '<', $data_file1) or die "Could not open file! $!"; 

#define variables and constants 
#Generate output files 
open(my $resultfh, '>', "AssociatedMarkersInLocus.txt") or die "Could not open file for write! $!"; 
print $resultfh "SNP\tinLocus?\n"; 

foreach my $Line (<$mainfh>) { 
    #remove new line character 
    open(my $dmfh, '<', $data_file2) or die("Could not open file! $!"); 
    $Line =~ s/[\f\n\r]*$//g; 
    my @main = split(/\t/, $Line); 
    print $resultfh "$main[0]"; 

    my $has_locus = 0; 

    LINE: foreach my $Line1 (<$dmfh>) { 
     $Line1 =~ s/[\f\n\r]*$//g; 
     my @loci = split(/\t/,$Line1); 

     if (($main[9] eq $loci[0]) 
      && ($main[11] >= $loci[7]) 
      && ($main[11]<$loci[8])) { 

      $has_locus = 1; 
      print $resultfh "\tinlocus"; 
      last LINE; 
     } 
    } 

    if ($has_locus == 0) { 
     print $resultfh "\tnolocus"; 
    } 

    print $resultfh "\n"; 
    close($dmfh); 
} 

close($resultfh); 
close($mainfh); 

#Report completion 
print "Program AssociatedMarkers finished.\n"; 
+0

Хм, это вроде сработало. «inLocus» появляется только один раз, но любой маркер, который не находится в локусе, работает вместе на одной и той же строке вместо собственной строки. Есть ли способ изменить пробелы на «notLocus»? Может быть, тогда каждый маркер все еще получает свою собственную линию, и его статус более определен, чем пустой. – user3482899

+0

Привет, я обновил свой ответ –

+0

Это сделало трюк! Умное использование истинного ложного тоже. И спасибо за советы по лучшей практике Perl. – user3482899

Смежные вопросы