Perl: Conditional replace based on previous and current value in a line


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl: Conditional replace based on previous and current value in a line
# 8  
Old 02-28-2012
You asked for perl in your last thread too, but this seemed arbitrary, and awk was better suited. If this ABSOLUTELY REQUIRES perl and nothing else will do, I apologize. You seemed to be able to use my last solution, though.

This thread is still redundant, however.
# 9  
Old 02-28-2012
Here you have a perl script:
Code:
use warnings;
use strict;

die qq[Usage: perl $0 <input-file>\n] unless @ARGV == 1;

my ($shift_port, $port3, @lines, @ports);

while ( <> ) { 
    chomp;

    if ( m/\A\s*(?i:shift_port)\s*=\s*(\S+)/ ) { 
        $shift_port = $1; 
    }   

    if ( m/\A\s*(?i:port3)\s*=\s*(\S+)/ ) { 
        $port3 = $1; 
    }   

    if ( $shift_port ) { 
        push @lines, $_; 
    }   

    if ( $shift_port && $port3 ) { 
        push @ports, [ $shift_port, $port3 ];
        undef $port3;
    }   


    if ( @ports == 2 ) { 
        if ( index( $ports[0][0], qq[P0] ) == 0  &&  
             index( $ports[0][1], qq[0] ) == 0  &&  
             index( $ports[1][0], qq[P0] ) == 0 &&  
             index( $ports[1][1], qq[0] ) == 0   
        ) { 
            $lines[ 0 ] =~ s/P0/M0/;
            $lines[ $#lines - 1 ] =~ s/P0/00/;
            printf qq[%s\n], join qq[\n], splice @lines;
            $shift_port = undef;
            $port3 = undef;
            @ports = (); 
        }   
        else {
            printf qq[%s\n], join qq[\n], splice @lines, 0, @lines - 2;
            shift @ports;
        }   

        next;
    }   

    unless ( $shift_port || $port3 ) { 
        printf qq[%s\n], $_; 
    }   

    if ( eof ) { 
        printf qq[%s\n], join qq[\n], splice @lines;
    }   
}

Run it like:
Code:
perl script.pl infile

And output is as you point out in your last post.

EDIT to say that agree with Corona688, don't duplicate posts because if another person already helped you and solved your problem, my try is useless.

Regards,
Birei
This User Gave Thanks to birei For This Post:
# 10  
Old 02-28-2012
Thanks Birei and Corona,
This isnt a homework problem. I wanted to edit some vectors at work and was struggling so seeked your help
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed conditional \n replace for each line

How could be removed \n only if appearing at position 80 in the line? (4 Replies)
Discussion started by: RomanF
4 Replies

2. Shell Programming and Scripting

Replace first field of a line with previous filed of the line

Hi Everyone, I have a file as below: IM2345638,sherfvf,usha,30 IM384940374,deiufbd,usha,30 IM323763822,cdejdkdnbds,theju,15 0,dhejdncbfd,us,20 IM398202038,dhekjdkdld,tj,30 0,foifsjd,u2,40 The output i need is as below IM2345638,sherfvf,usha,30... (4 Replies)
Discussion started by: usha rao
4 Replies

3. Shell Programming and Scripting

Perl to send previous and current value

For example, I have a file called number.txt. x y 1 1 2 4 3 9 4 6 5 5 6 6 7 9 8 4 9 1 10 0 ... And I want to print out the value of x and y, if y%4==0 and the next value of y%4==0. Thus, the sample output is: 1 1 *because the previous x before 2 is 1 2 4 *because 4%4 == 0 7 9... (2 Replies)
Discussion started by: Tzeronone
2 Replies

4. Shell Programming and Scripting

Sed Comparing Parenthesized Values In Previous Line To Current Line

I am trying to delete lines in archived Apache httpd logs Each line has the pattern: <ip-address> - - <date-time> <document-request-URL> <http-response> <size-of-req'd-doc> <referring-document-URL> This pattern is shown in the example of 6 lines from the log in the code box below. These 6... (1 Reply)
Discussion started by: Proteomist
1 Replies

5. UNIX for Dummies Questions & Answers

Awk to print data from current and previous line

Hi guys, I have found your forum super useful. However, right now I am stuck on a seemingly "simple" thing in AWK. I have two columns of data, the first column in Age (in million years) and the second column is Convergence Rate (in mm/yr). I am trying to process my data so I can use it to... (2 Replies)
Discussion started by: awk_noob_456
2 Replies

6. Shell Programming and Scripting

Printing previous line based on pattern using sed

Hi, I have a written a shell script to get the previous line based on the pattern. For example if a file has below lines: ---------------------------------------------- #UNBLOCK_As _per #As per 205.162.42.92 #BLOCK_As_per #----------------------- #input checks abc.com... (5 Replies)
Discussion started by: Anjan1
5 Replies

7. Shell Programming and Scripting

How to use sed to search for string and Print previous two lines and current line

Hello, Can anybody help me to correct my sed syntax to find the string and print previous two lines and current line and next one line. i am using string as "testing" netstat -v | sed -n -e '/test/{x;2!p;g;$!N;p;D;}' -e h i am able to get the previous line current line next line but... (1 Reply)
Discussion started by: nmadhuhb
1 Replies

8. Shell Programming and Scripting

Print previous, current and next line using sed

Hi, how can i print the previous, current and next line using sed? current line is the matching line. The following prints all lines containing 'Failure' and also the immediate next line cat $file | sed -n -e '/Failure/{N;p;}' Now, i also want to print the previous line too. Thanks,... (8 Replies)
Discussion started by: ysrinu
8 Replies

9. Shell Programming and Scripting

sed conditional string replace for each line

Hi all, I appreciate the enormous amount of knowledge that flows in this forum. I am an average UNIX user. I have many files with lines like the below. I have separated each line with space for ease of reading. I need to replace the first occurance of "/00" with null on those lines that have... (6 Replies)
Discussion started by: Nanu_Manju
6 Replies

10. Shell Programming and Scripting

replace [previous] line

Hi ,suppose I have a file title=dsafsadf ........ ....... year=1995 author=john smith ............ title=bbbbbb ........ ....... year=1988 author=alex I need to replace the title line with a expression that contains variables year and author. I want to use a python readline for loop.... (10 Replies)
Discussion started by: grossgermany
10 Replies
Login or Register to Ask a Question