Unconfigured Ad

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • semna
    Member
    • Apr 2010
    • 55

    #1

    regular expression in perl?

    Hi,
    I have a list contains:
    ID : 741158
    PARENT ID : 9605
    RANK : species
    GC ID : 1
    MGC ID : 2
    SCIENTIFIC NAME : Homo sp. Altai
    GENBANK COMMON NAME : Denisova hominin
    //
    In some part of this file the rank is subspecies. I just need those ID line (first line) which belong to species not subspecies:
    I used this : my @new_list = grep {$_ =~ /\bspecies$/ && /\nID +\: *([\d]+)/} @list;
    but is not working. Any suggestion? Thanks
  • steven
    Senior Member
    • Aug 2009
    • 269

    #2
    cat file | awk '$1=="ID"{id=$0} $1=="RANK" && $3=="species"{print id}'

    Assuming an ID line is provided for each entry.
    If you just need the ID number, use "id=$3" instead of "id=$0".

    Comment

    • semna
      Member
      • Apr 2010
      • 55

      #3
      Thanks Steven. But I am not sure that it works in perl .

      Comment

      • gringer
        David Eccles (gringer)
        • May 2011
        • 845

        #4
        So, you asked about perl. Here's a one-liner that roughly matches steven's awk script:
        Code:
        $ perl -ne 'if(/ID *: *(\d+)/){$id=$1};if(/RANK *: *species/){print "$id\n"}' file.txt
        9605
        If you're using it inside some other perl code, you'd probably do something like this:
        Code:
        my @new_list = ();
        my $id = "";
        # this assumes you want to store IDs from files or standard in
        while(<>){
          if(/^ID *: *(\d+)/){$id=$1};
          if($id && /^RANK *: *species/){
            push(@new_list, $id);
          }
        }
        Or if you're reading from the array @list, which contains one element per line:
        Code:
        my @new_list = ();
        my $id = "";
        foreach(@list){
          if(/^ID *: *(\d+)/){$id=$1};
          if($id && /^RANK *: *species/){
            push(@new_list, $id);
          }
        Or, assuming your example is exactly as your code looks (i.e. each element in @list contains a number of lines, but only one record per list element):
        Code:
        my @new_list = ();
        foreach (@list){
          if(/^RANK *: *species/){
            if(/^ID *: *(\d+)/){
              push(@new_list, $1);
            }
          }
        }
        [but if that were the case, your code would probably work, but would spit out the entire record, rather than just the ID]


        I would advise you to stay away from using grep in situations like this where you're modifying things inside a loop. It would do weird things like not adding to your result array if $id were 0, and changing $_ would alter your original list. See here for more information:

        Comment

        • steven
          Senior Member
          • Aug 2009
          • 269

          #5
          Yes, that is not perl indeed but awk. If you really need to include this in a bigger perl code, the equivalent can be obtained by splitting the lines and adding a couple of "if" and "else". And I bet the same can be obtained by just using linux command lines, directly from the shell.

          Comment

          • steven
            Senior Member
            • Aug 2009
            • 269

            #6
            Nice job gringer, that is a complete answer

            Comment

            • gringer
              David Eccles (gringer)
              • May 2011
              • 845

              #7
              I bet the same can be obtained by just using linux command lines, directly from the shell
              I think an awk one-liner is close enough to 'linux commands, directly from the shell'. A command-line equivalent using multiple grep pipes would go something like this:
              $ grep '^\(ID\|RANK\)' file.txt | grep -B 1 '^RANK : species' | grep -v '^RANK'
              ID : 741158
              Although you'd run into problems with that if any IDs didn't have associated ranks following them.

              Comment

              • semna
                Member
                • Apr 2010
                • 55

                #8
                Thanks so much Gringer and Steven.

                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, 10:52 AM
                0 responses
                9 views
                0 reactions
                Last Post SEQadmin2  
                Started by SEQadmin2, 10-14-2026, 05:39 AM
                0 responses
                19 views
                0 reactions
                Last Post SEQadmin2  
                Started by SEQadmin2, 10-13-2026, 09:56 AM
                0 responses
                16 views
                0 reactions
                Last Post SEQadmin2  
                Started by SEQadmin2, 10-09-2026, 11:14 AM
                0 responses
                27 views
                0 reactions
                Last Post SEQadmin2  
                Working...