G'day ag88,
Welcome to the monastery.
You can treat each BLASTP block as a single record. This makes it easy to identify which have "0 hits found", and print their "gi" values. (In the code below, I've truncated the data lines to 60 characters.)
#!/usr/bin/env perl -l use strict; use warnings; { local $/ = "# BLASTP 2.2.28+\n"; while (<DATA>) { print /gi\|(\d+)/ if /0 hits found/; } } __DATA__ # BLASTP 2.2.28+ # Query: gi|338220664|gb|EGP06123.1| hypothetical protein GE # Database: nr-25sep # Fields: query id, subject id, % identity, alignment length # 2 hits found gi|338220664|gb|EGP06123.1| gi|45383702|ref|NP_989542.1| gi|338220664|gb|EGP06123.1| gi|15419940|gb|AAK97214.1| 44.1 # BLASTP 2.2.28+ # Query: gi|338220666|gb|EGP06125.1| hypothetical protein GE # Database: nr-25sep # 0 hits found # BLASTP 2.2.28+ # Query: gi|338220651|gb|EGP06111.1| hypothetical protein GE # Database: nr-25sep # 0 hits found
Output:
338220666 338220651
See "perlvar: Variables related to filehandles" for a discussion of this usage of "$/" (the input record separator).
-- Ken
In reply to Re: Print a previous to previous of a matching line
by kcott
in thread Print a previous to previous of a matching line
by ag88
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |