저는 생물학자이고 Perl을 처음 접하기 때문에 Perl 전문가의 도움을 받고 싶습니다.
고양이 입력.txt
##gff-version 2
##source-version geneious 5.6.3
gi371443188gbJH5566721_extraction_reversed Geneious CDS 1043 1132 . + . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed Geneious CDS 2063 2260 . + . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed Geneious CDS 2336 2593 . + . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed Geneious CDS 3474 3633 . + . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed Geneious extracted region 1 13933 . + . Name=Extracted region from gi|371443188|gb|JH556672.1|;Extracted interval="2010140 <- 2024072"
내 출력.txt
gi371443188gbJH5566721_extraction_reversed CDS 2023029 2022940 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed CDS 2022009 2021812 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed CDS 2021736 2021479 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed CDS 2020598 2020439 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
###
내 예상 결과
gi_371443188_gb_JH5566721 gene 2020598 2023029 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.13412469767431
gi_371443188_gb_JH5566721 CDS 2020598 2020439 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi_371443188_gb_JH5566721 CDS 2021736 2021479 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi_371443188_gb_JH5566721 CDS 2022009 2021812 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi_371443188_gb_JH5566721 CDS 2023029 2022940 . - . Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
###
아래 제공된 Perl 코드의 출력 형식을 다시 지정하려면 Perl 전문가의 도움이 필요합니다.
1. 출력의 배열[0]에 점수를 추가하고 싶습니다(예: gi371443188gbJH5566721_extraction_reversed to gi_371443188_gb_JH5566721)
2. 출력의 3열과 4열의 값을 기준으로 CDS의 행을 오름차순으로 정렬합니다(예상 출력 참조).
3. CDS 라인의 최소값과 최대값을 포함하는 gi_371443188_gb_JH556672.1 유전자로 파일 상단에 새로운 라인을 추가합니다(예상 출력 참조)
내 Perl 코드는 다음과 같습니다.
#usr/bin/perl;
open(FH,"$ARGV[0]");
my %num="";
my %all="";
while(<FH>){
chomp $_;
my @array=split("\t"); #print "$array[2]\n";
if($array[2] eq "extracted region"){
$array[8]=~/.*\w+=\"\d+ <- (\d+)"/gm;
$num{$array[0]}="$1";
}
if($array[2] eq "CDS"){
$all{$array[0]}.="$_\n";
}
}
foreach $i (keys %all){
my @line=split "\n",$all{$i};
for ($j=0;$j<=$#line;$j++){
my @new_line=split "\t",$line[$j];
my $pos1=$num{$i}-$new_line[3];
my $pos2=$num{$i}-$new_line[4]; #print $num{$i}; exit;
$new_line[6] =~ s/\+/-/g;
print "$new_line[0]\t$new_line[2]\t$pos1\t$pos2\t$new_line[5]\t$new_line[6]\t$new_line[7]\t$new_line[8]\n";
}
}
print "###\n";
답변1
가장 깨끗하지는 않지만 이렇게 하면 트릭을 수행할 수 있습니다(즉, 내 출력이 귀하의 출력과 일치함).
밑줄을 추가하는 정규식을 조합할 수 있습니다. 그러나 정렬을 위해서는 모든 출력 행을 목록에 푸시한 다음 정렬해야 합니다(수신 측에서도 수행할 수 있지만 먼저 모든 출력 행을 한 위치에 배치해야 함).
--- test.pl~ 2012-07-13 12:04:36.000000000 -0700
+++ test.pl 2012-07-13 12:17:58.000000000 -0700
@@ -1,4 +1,4 @@
-#usr/bin/perl
+#!/usr/bin/perl
use strict;
open(FH,"$ARGV[0]");
@@ -18,6 +18,7 @@
}
my $i;
+ my @output;
foreach $i (keys %all){
my @line=split "\n",$all{$i};
@@ -27,8 +28,15 @@
my $pos1=$num{$i}-$new_line[3];
my $pos2=$num{$i}-$new_line[4]; #print $num{$i}; exit;
$new_line[6] =~ s/\+/-/g;
- print "$new_line[0]\t$new_line[2]\t$pos1\t$pos2\t$new_line[5]\t$new_line[6]\t$new_line[7]\t$new_line[8]\n";
+ $new_line[0] =~ s/gi/gi_/;
+ $new_line[0] =~ s/gb/_gb_/;
+ $new_line[0] =~ s/_extraction_reversed//;
+ push @output, "$new_line[0]\t$new_line[2]\t$pos1\t$pos2\t$new_line[5]\t$new_line[6]\t$new_line[7]\t$new_line[8]\n";
}
}
+ @output = sort (@output);
+ foreach my $out (@output) {
+ print $out;
+ }
print "###\n";