Unconfigured Ad

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • AmyEllison
    Member
    • Nov 2012
    • 16

    #1

    Perl script help please - combining files

    I have a tab-delimited text file like this (GOTERMS):

    Code:
    contig11 GO:100 other columns of data
    contig11 GO:289 other columns of data
    contig11 GO:113 other columns of data
    contig22 GO:388 other columns of data
    contig22 GO:101 other columns of data
    And another like this (SNPS):

    Code:
    contig11 3 N
    contig11 1 Y
    contig22 1 Y
    contig22 2 N
    I need to combine them so that each 'multiple' entry of one of the files is duplicated and populated with its data in the other, so that I get:

    Code:
    contig11 3 N GO:100 other columns of data
    contig11 3 N GO:289 other columns of data
    contig11 3 N GO:113 other columns of data
    contig11 1 Y GO:100 other columns of data
    contig11 1 Y GO:289 other columns of data
    contig11 1 Y GO:113 other columns of data
    contig22 1 Y GO:388 other columns of data
    contig22 1 Y GO:101 other columns of data
    contig22 2 N GO:388 other columns of data
    contig22 2 N GO:101 other columns of data
    It was suggested I store the rows of the first file in a hash indexed by the row's id:

    Code:
    #!/usr/bin/env/perl
    
    use warnings;
    
    open (GOTERMS, "$ARGV[0]") or die "Error opening the input file with GO terms";
    open (SNPS, "$ARGV[1]") or die "Error opening the input file with SNPs";
    
    my %goterm;
    
    while (<GOTERMS>)
    {
        my($id, $rest) = /^(\S++)(,*)/s;
        push @{$goterm{$id}}, $rest;
    }
    
    while (my $row2 = <SNPS>)
    {
        chomp($row2);
        my ($id) = $row2 =~ /^(\S+)/;
        for my $rest (@{ $goterm{$id} })
        {
            print("$row2$rest\n");
        }
    }
    
    close GOTERMS;
    close SNPS;
    But I am not getting the GO column onwards in the final file, just duplicated lines of SNPS file - can anyone suggest where I'm going wrong with this script or suggest another solution?
  • mastal
    Senior Member
    • Mar 2009
    • 666

    #2
    Hi,

    It looks to me like what you really want is to make your data into two SQL tables and perform a table join, one that gives you the union of both tables.

    Comment

    • mastal
      Senior Member
      • Mar 2009
      • 666

      #3
      Perl script help please - combining files

      Try modifying the perl script as follows:

      Add

      Code:
      use strict;
      before the 'use warnings;' line.

      change
      Code:
          my($id, $rest) = /^(\S++)(,*)/s;
      to

      Code:
         my($id, $rest) =~ /^(\S+)(.*)/;
      I think the line above is the main reason the script wasn't printing the columns with the GO data.

      change
      Code:
         for my $rest (@{ $goterm{$id} })
          {
              print("$row2$rest\n");
          }
      to

      Code:
         foreach my $rest (@{$goterm{$id}})
          {
              print "$row2\t$rest");
          }

      Comment

      • swbarnes2
        Senior Member
        • May 2008
        • 910

        #4
        I don't think this is right:

        Code:
         my($id, $rest) = /^(\S++)(,*)/s;
        I bet you want

        Code:
        my($id, $rest) = /^(\S+)(.*)/;

        Comment

        • id0
          Senior Member
          • Sep 2012
          • 130

          #5
          Does this have to be done in perl?

          There is a UNIX join command that can do this in one line (if I am understanding the question correctly):

          Comment

          • AmyEllison
            Member
            • Nov 2012
            • 16

            #6
            Wooops - yep changing the comma to fullstop did the trick - what a silly typo! Thanks for pointing it out!!

            Comment

            • syfo
              Just a member
              • Nov 2012
              • 103

              #7
              Originally posted by AmyEllison View Post
              I have a tab-delimited text file like this (GOTERMS):

              Code:
              contig11 GO:100 other columns of data
              contig11 GO:289 other columns of data
              contig11 GO:113 other columns of data
              contig22 GO:388 other columns of data
              contig22 GO:101 other columns of data
              And another like this (SNPS):

              Code:
              contig11 3 N
              contig11 1 Y
              contig22 1 Y
              contig22 2 N
              I need to combine them so that each 'multiple' entry of one of the files is duplicated and populated with its data in the other, so that I get:

              Code:
              contig11 3 N GO:100 other columns of data
              contig11 3 N GO:289 other columns of data
              contig11 3 N GO:113 other columns of data
              contig11 1 Y GO:100 other columns of data
              contig11 1 Y GO:289 other columns of data
              contig11 1 Y GO:113 other columns of data
              contig22 1 Y GO:388 other columns of data
              contig22 1 Y GO:101 other columns of data
              contig22 2 N GO:388 other columns of data
              contig22 2 N GO:101 other columns of data
              It was suggested I store the rows of the first file in a hash indexed by the row's id:

              Code:
              #!/usr/bin/env/perl
              
              use warnings;
              
              open (GOTERMS, "$ARGV[0]") or die "Error opening the input file with GO terms";
              open (SNPS, "$ARGV[1]") or die "Error opening the input file with SNPs";
              
              my %goterm;
              
              while (<GOTERMS>)
              {
                  my($id, $rest) = /^(\S++)(,*)/s;
                  push @{$goterm{$id}}, $rest;
              }
              
              while (my $row2 = <SNPS>)
              {
                  chomp($row2);
                  my ($id) = $row2 =~ /^(\S+)/;
                  for my $rest (@{ $goterm{$id} })
                  {
                      print("$row2$rest\n");
                  }
              }
              
              close GOTERMS;
              close SNPS;
              But I am not getting the GO column onwards in the final file, just duplicated lines of SNPS file - can anyone suggest where I'm going wrong with this script or suggest another solution?
              Yes:
              Code:
              join file2 file1

              Comment

              • syfo
                Just a member
                • Nov 2012
                • 103

                #8
                Originally posted by id0 View Post
                Does this have to be done in perl?

                There is a UNIX join command that can do this in one line (if I am understanding the question correctly):
                http://www.albany.edu/~ig4895/join.htm
                Exactly (I didn't see your post, sorry).

                Comment

                Latest Articles

                Collapse

                • SEQadmin2
                  Multiomic Liquid Biopsy: What DNA/RNA Panels Reveal That DNA Alone Can’t
                  by SEQadmin2



                  Tumors contain complex mixtures of cell populations that evolve in response to treatment and host-specific factors. Tissue biopsies provide only static snapshots of a tumor’s state. But what if we could follow that evolution over time using a minimally invasive technique?

                  Liquid biopsies can detect tumor-derived material circulating in the bloodstream, providing a way to study treatment response, detect emerging resistance, and discover new biomarkers. Circulating
                  ...
                  10-14-2026, 09:55 AM
                • SEQadmin2
                  New Genomics Technologies Take Aim at Long-Standing Limits
                  by SEQadmin2


                  Researchers using sequencing and genomics tools often have to make trade-offs. They can choose between speed or scale, short reads or long-range information, or targeted panels or a view of the whole transcriptome. New technologies that have been released this year are built to address those tough choices.

                  We asked six companies the same four questions to learn about their latest products. The new technologies bring a lot to the table, including rethinking sequencing
                  ...
                  09-28-2026, 10:25 AM

                ad_right_rmr

                Collapse

                News

                Collapse

                Topics Statistics Last Post
                Started by SEQadmin2, Yesterday, 11:13 AM
                0 responses
                16 views
                0 reactions
                Last Post SEQadmin2  
                Started by SEQadmin2, Yesterday, 10:48 AM
                0 responses
                17 views
                0 reactions
                Last Post SEQadmin2  
                Started by SEQadmin2, 10-15-2026, 10:52 AM
                0 responses
                35 views
                0 reactions
                Last Post SEQadmin2  
                Started by SEQadmin2, 10-14-2026, 05:39 AM
                0 responses
                42 views
                0 reactions
                Last Post SEQadmin2  
                Working...