The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
sed: find match and delete the line above cstovall Shell Programming and Scripting 3 07-02-2008 10:31 PM
Perl: Match a line with multiple search patterns Juha Shell Programming and Scripting 10 04-09-2008 01:43 AM
Multiple line match using sed SiftinDotCom Shell Programming and Scripting 15 03-28-2008 02:12 PM
read and match multiple lines in perl zx1106 Shell Programming and Scripting 5 03-14-2008 10:21 PM
sed - Replace Line which contains the Pattern match with a new line kousikan Shell Programming and Scripting 2 03-24-2007 07:24 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 03-27-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Posts: 163
Unhappy if match found go to a particular line in perl

Hello Experts,

I am newbie to perl, just curious to know how to do the following in perl.
suppose I ve a txt file like below. when it founds "*Main Start"
Then go to "*Main End,,,,,,,," patteren and just collect the number from the previous line of "*Main End,,,,,,," pattern . In my case it is 5 . Then start excuting normally from the "*Main Start" position

Following is the picture .. I dont want to create any temp file also..
Input file:
Code:
*Init End
*Main Start
*Comment Reset Timers
000000,0000,0,0,0,0,0,1,0
000000,0000,0,0,0,0,1,1,0 
*Comment Control Frame at 1.04596 ms
000000,0400,0,0,0,0,1,0,1
2418A4,0000,0,1,3,0,0,0,0 
049C00,0000,0,0,2,0,0,0,0
*Comment Control Frame at 1.04673 ms
*Comment Control Frame at
000002,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000100,0000,0,0,2,0,0,0,0
*Comment Control Frame at
000004,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000000,0000,0,0,2,0,0,0,0
*Comment Frame 13 at ** us,,,,,,,,
000005,7E3D,0,0,0,0,1,0,1
*Main End,,,,,,,,
output:
Code:
*Init End
*Main Start
 repeat(5);
process all lines as usual here.

............
*Main End,,,,,,,,,
I ve to print all lines as it is when it found a line starting with * . Thats why I am doing like below
Code:
 if(m/^\*/){
              print "//", $_;
              next;
    }
Code:
Basic Algorithm of my programme need :
1. If "*Main Start" pattern found go to line where Pattern matches "*Main end".
2. Get the previous line. and get the value of the first field.
3. Return to "*Main start" position again. & Print repeat(that number) : in my case it is 5 :
4. stop/next;
Any help most appriciated..

regards,
user_prady

Last edited by user_prady; 03-28-2008 at 12:51 AM..
  #2 (permalink)  
Old 03-30-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Posts: 163
Is it not possible!!

Quote:
Originally Posted by user_prady View Post
Hello Experts,

I am newbie to perl, just curious to know how to do the following in perl.
suppose I ve a txt file like below. when it founds "*Main Start"
Then go to "*Main End,,,,,,,," patteren and just collect the number from the previous line of "*Main End,,,,,,," pattern . In my case it is 5 . Then start excuting normally from the "*Main Start" position

Following is the picture .. I dont want to create any temp file also..
Input file:
Code:
*Init End
*Main Start
*Comment Reset Timers
000000,0000,0,0,0,0,0,1,0
000000,0000,0,0,0,0,1,1,0 
*Comment Control Frame at 1.04596 ms
000000,0400,0,0,0,0,1,0,1
2418A4,0000,0,1,3,0,0,0,0 
049C00,0000,0,0,2,0,0,0,0
*Comment Control Frame at 1.04673 ms
*Comment Control Frame at
000002,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000100,0000,0,0,2,0,0,0,0
*Comment Control Frame at
000004,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000000,0000,0,0,2,0,0,0,0
*Comment Frame 13 at ** us,,,,,,,,
000005,7E3D,0,0,0,0,1,0,1
*Main End,,,,,,,,
output:
Code:
*Init End
*Main Start
 repeat(5);
process all lines as usual here.

............
*Main End,,,,,,,,,
I ve to print all lines as it is when it found a line starting with * . Thats why I am doing like below
Code:
 if(m/^\*/){
              print "//", $_;
              next;
    }
Code:
Basic Algorithm of my programme need :
1. If "*Main Start" pattern found go to line where Pattern matches "*Main end".
2. Get the previous line. and get the value of the first field.
3. Return to "*Main start" position again. & Print repeat(that number) : in my case it is 5 :
4. stop/next;
Any help most appriciated..

regards,
user_prady
Hi friends is there anyway to do it. Pls help ..

Thanks

Last edited by user_prady; 03-30-2008 at 10:07 AM..
  #3 (permalink)  
Old 03-30-2008
era era is offline Forum Advisor  
Herder of Useless Cats (On Sabbatical)
  
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,652
Don't depend on me, I need to be going back to my day job soon.

There's a number of ways to do this, obviously. The old-fashioned variant would be to remember the previous line and print that when you see the terminator. The really brute Perl approach would be to slurp the whole file and substitute everything with an empty string except the line before the terminator. There's one in the Perl FAQ about that; perlfaq6 and scroll around for related questions. (The question about C comments further down the page has some hints, too.)

But the "previous line" solution is absolutely the simplest in this case, if you have no further requirements.

Code:
perl -ne 'BEGIN { $matching = 0; }
  $matching = 1 if (m/^\*Main Start/);
  next unless $matching;
  print $prev if (defined $prev && m/^\*Main End/);
  $prev = $_'
Not sure about the flow control you tried to describe. Are you supposed to remember everything from main start until main end and print that after the output from the last line before main end? (I guess this already qualifies as a pseudo-code implementation of what it takes. But then maybe I would consider a regex substitution over the whole file, or each *Main Start section, after all.)

Last edited by era; 03-30-2008 at 06:22 AM.. Reason: Add a Perl snippet for remembering previous line
  #4 (permalink)  
Old 03-30-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Posts: 163
Quote:
Originally Posted by era View Post
Don't depend on me, I need to be going back to my day job soon.

There's a number of ways to do this, obviously. The old-fashioned variant would be to remember the previous line and print that when you see the terminator. The really brute Perl approach would be to slurp the whole file and substitute everything with an empty string except the line before the terminator. There's one in the Perl FAQ about that; perlfaq6 and scroll around for related questions. (The question about C comments further down the page has some hints, too.)

But the "previous line" solution is absolutely the simplest in this case, if you have no further requirements.

Code:
perl -ne 'BEGIN { $matching = 0; }
  $matching = 1 if (m/^\*Main Start/);
  next unless $matching;
  print $prev if (defined $prev && m/^\*Main End/);
  $prev = $_'
Not sure about the flow control you tried to describe. Are you supposed to remember everything from main start until main end and print that after the output from the last line before main end? (I guess this already qualifies as a pseudo-code implementation of what it takes. But then maybe I would consider a regex substitution over the whole file, or each *Main Start section, after all.)
Thanks a Lot Era for your kindness..I ll try your mentioned way..
  #5 (permalink)  
Old 03-30-2008
era era is offline Forum Advisor  
Herder of Useless Cats (On Sabbatical)
  
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,652
I don't think I have captured all your requirements correctly but at least it's a start. If I am allowed to guess, what would be easiest is collect the output in a variable and print it after you have seen *Main End and printed out the line which immediately preceded it.
  #6 (permalink)  
Old 03-31-2008
user_prady user_prady is offline
Registered User
  
 

Join Date: Sep 2007
Posts: 163
how to do it in perl

Quote:
Originally Posted by era View Post
I don't think I have captured all your requirements correctly but at least it's a start. If I am allowed to guess, what would be easiest is collect the output in a variable and print it after you have seen *Main End and printed out the line which immediately preceded it.
I tried almost all way using next , redo and last command in perl , But I can't get these syntax correctly in perl. I know its easy ,but still I cant find the efficient way using while and next statement in perl.

I am trying to do the follwoing in perl

Code:
nawk ' {
        if($0 ~ /^\*Main Start/){
	     while( $0 !~ /^\*Main End/){
	     print $0;
             getline;
        }
     }
 } ' my.txt
One more code I want to do it in perl pls give me some basic idea how to do it without creating any temporary files ..

Code:

TMP=/tmp/my_tmp$$
nawk '
/\*Main End/{
split(x,arr,",")
print "Loop  " arr[1]
};
{x=$0
}
' my.txt > $TMP 

nawk '{
if($0 ~ /^Loop/){
    loop = $2 
    next;
  }
if($0 ~ /^\*Main Start/){
     printf "\nrepeat ("
     print  loop

} ' $TMP $my.txt

Thanks & Regards,
user_prady

Last edited by user_prady; 03-31-2008 at 01:48 AM..
Closed Thread

Bookmarks

Tags
perl, perl regex, perl shift, regex, shift, shift perl, solaris

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 09:34 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0