Seqanswers Leaderboard Ad

Collapse

Announcement

Collapse
No announcement yet.
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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

  • #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


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

      Comment


      • #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


        • #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


          • #6
            Nice job gringer, that is a complete answer

            Comment


            • #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


              • #8
                Thanks so much Gringer and Steven.

                Comment

                Latest Articles

                Collapse

                • seqadmin
                  Best Practices for Single-Cell Sequencing Analysis
                  by seqadmin



                  While isolating and preparing single cells for sequencing was historically the bottleneck, recent technological advancements have shifted the challenge to data analysis. This highlights the rapidly evolving nature of single-cell sequencing. The inherent complexity of single-cell analysis has intensified with the surge in data volume and the incorporation of diverse and more complex datasets. This article explores the challenges in analysis, examines common pitfalls, offers...
                  06-06-2024, 07:15 AM
                • seqadmin
                  Latest Developments in Precision Medicine
                  by seqadmin



                  Technological advances have led to drastic improvements in the field of precision medicine, enabling more personalized approaches to treatment. This article explores four leading groups that are overcoming many of the challenges of genomic profiling and precision medicine through their innovative platforms and technologies.

                  Somatic Genomics
                  “We have such a tremendous amount of genetic diversity that exists within each of us, and not just between us as individuals,”...
                  05-24-2024, 01:16 PM

                ad_right_rmr

                Collapse

                News

                Collapse

                Topics Statistics Last Post
                Started by seqadmin, 06-07-2024, 06:58 AM
                0 responses
                13 views
                0 likes
                Last Post seqadmin  
                Started by seqadmin, 06-06-2024, 08:18 AM
                0 responses
                23 views
                0 likes
                Last Post seqadmin  
                Started by seqadmin, 06-06-2024, 08:04 AM
                0 responses
                20 views
                0 likes
                Last Post seqadmin  
                Started by seqadmin, 06-03-2024, 06:55 AM
                0 responses
                14 views
                0 likes
                Last Post seqadmin  
                Working...
                X