จะเปรียบเทียบแต่ละองค์ประกอบของฐานข้อมูลสองฐานข้อมูลที่แตกต่างกันในไฟล์ข้อความโดยใช้ Perl ได้อย่างไร

ฉันกำลังพยายามเปรียบเทียบแต่ละองค์ประกอบของคอลัมน์ 1 จากรายการหนึ่ง (screens.txt) กับองค์ประกอบใดๆ ของคอลัมน์ 1 จากอีกรายการ (new_list.txt) และหากตรงกัน ให้พิมพ์ทั้งแถวของรายการ (screens.txt) ในไฟล์ข้อความแยกต่างหาก (matched.txt) ฉันจัดการเพื่อเลือกคอลัมน์ที่ถูกต้อง แต่ผลลัพธ์ที่ฉันได้รับคือแถวจากรายการ (new_list.txt) แทนที่จะเป็นรายการ (screens.txt) และมีการเข้าชมเพียงครั้งเดียว พบดังนั้นดูเหมือนว่าจะมีปัญหากับการวนซ้ำด้วย

new_list.txt รูปแบบ => first_column->double_tab->the_rest

ฉันยังใหม่มากในการเขียนโปรแกรม Perl ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!

นี่คือสิ่งที่ฉันได้ทำไปแล้ว:

#!usr/bin/perl

use warnings;

$list = "new_list.txt";
$screens = "screens.txt";
$result = "matched.txt";

open (FA, "<$list") or die "Can't read source file $list: $!\n";
open (RES, ">$result") or die "Can't write on file $result: $!\n";

$n = 0;
$column = 10;
while ($line = <FA>) {
    @description = split (' ', $line);
    @ID = split ('\\t', $description[0]);   
       #print just first column from the list
      #  print "$ID[0]\n";
}

close (FA);

open (FA, "$screens") or die "Can't read source file $screens: $!\n";

while ($file = <FA>) {
    @table = split (' ', $file);
    @accession_no = split ('\ ', $table[0]);
      # print the first column from the list    
      #  print "$accession_no[0]\n";
}

open (FA, "<$list") or die "Can't read source file $list: $!\n";

while ($line = <FA>) {
    print "$line\n";
    @description = split (' ', $line);
    @ID = split ('\\t', $description[0]);
    if ($accession_no eq $ID[0]) {
        $n = $n+1;
        for ($i = 0; $i < $column; $i++) {
            print RES "$file";
        }

        print "\n";
    }   
}

close (FA);
close (RES);

print "Hits found: $n\n";

นี่คือตัวอย่างของ next_list.txt: Q9UKA8 RCAN3_HUMAN 0

Q9UKA8-2 RCAN3_HUMAN 0

Q9UKA8-3 RCAN3_HUMAN 0

Q9UKA8-4 RCAN3_HUMAN 0

Q9UKA8-5 RCAN3_HUMAN 0

Q9GZP0 PDGFD_HUMAN 0

นี่คือไฟล์อินพุตจาก screens.txt:

Q9GZP0 GDLDLASEST ปัจจัยแนบนั่งร้าน B2 (SAF-B2) SAFB2

Q9UKA8-5 QKAFNSSSFN Ran โปรตีนกระตุ้นการทำงานของ GTPase 1 (RanGAP1) RANGAP1

ฉันสนใจที่จะตรวจสอบว่า Q9GZP0 และ Q9UKA8-5 (คอลัมน์แรก)

จาก screens.txt อยู่ในคอลัมน์แรกของ new_list.txt และหากพวกเขา

จากนั้นจะพิมพ์ทั้งบรรทัด/แถวจาก screens.txt

ขอบคุณล่วงหน้า!


person student24    schedule 16.01.2020    source แหล่งที่มา
comment
คุณสามารถรวมตัวอย่างไฟล์อินพุตได้หรือไม่?   -  person choroba    schedule 16.01.2020
comment
โปรดอัปเดตคำถามแทนการโพสต์ความคิดเห็น   -  person choroba    schedule 16.01.2020


คำตอบ (2)


ดูว่าสิ่งนี้ช่วยคุณได้หรือไม่:

#!/usr/bin/perl

use strict;
use warnings;

my $file1 = "file_pr1.txt";
my $file2 = "file_pr2.txt";
my $resulted_list = "result_list.txt";

my (@description, @ID, @data);

open (my $FA, "<$file1") or die "Can't read source file $file1: $!\n";

while (my $line = <$FA>) {
    chomp($line);
    @description = split (/\s+/, $line);
    push (@ID, $description[0]);   
}
close($FA);

my %params = map { $_ => 1 } @ID; #add each elements into hash

open (my $RES, ">$resulted_list") or die "Open as write error : $!\n";

open (my $FB, "<$file2") or die "Can't read source file $file2: $!\n";

while (my $line = <$FB>) {
    chomp($line);
    @data = split (/\s+/, $line);
    print $RES $line."\n" if(exists($params{$data[0]})); #Write to result file
}
close($RES);
person vkk05    schedule 16.01.2020

รหัสขั้นต่ำในการกรอง หน้าจอ ด้วยพลัง map บล็อก

#!/usr/bin/perl

use strict;
use warnings;

my $input1 = 'new_list.txt';
my $input2 = 'screens.txt';

my %seen;

open my $fh1, "< $input1"
    or die "Couldn't open $input1";

map{ $seen{$1} = $2 if /(\S+)\s(.*)/ } <$fh1>;

close $fh1;

open my $fh2, "< $input2"
    or die "Couldn't open $input2";

map{ print if /(\S+)\s+(.*)/ and $seen{$1} } <$fh2>;

close $fh2;

อินพุต: new_list.txt

Q9UKA8 RCAN3_HUMAN 0
Q9UKA8-2 RCAN3_HUMAN 0
Q9UKA8-3 RCAN3_HUMAN 0
Q9UKA8-4 RCAN3_HUMAN 0
Q9UKA8-5 RCAN3_HUMAN 0
Q9GZP0 PDGFD_HUMAN 0

อินพุต: screens.txt

Q9GZP0 GDLDLASEST Scaffold attachment factor B2 (SAF-B2) SAFB2
Q9UKA8-5 QKAFNSSSFN Ran GTPase-activating protein 1 (RanGAP1) RANGAP1 

เอาท์พุท:

Q9GZP0 GDLDLASEST Scaffold attachment factor B2 (SAF-B2) SAFB2
Q9UKA8-5 QKAFNSSSFN Ran GTPase-activating protein 1 (RanGAP1) RANGAP1 

บันทึก:

Linux -- ทำให้โปรแกรมสามารถเรียกใช้งานได้ด้วยคำสั่ง chmod og+x program.pl

Windows -- รันโปรแกรมเป็น perl program.pl

เปลี่ยนเส้นทางเอาต์พุตเป็นไฟล์ด้วยคำสั่ง:

ลินุกซ์ - program.pl > matched.txt

หน้าต่าง - perl program.pl > matched.txt

person Polar Bear    schedule 16.01.2020