Perl pattern matching!!


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl pattern matching!!
# 1  
Old 09-29-2009
Perl pattern matching!!

Hi experts,

I have many occurances of the following headers in a file. I need to grep for the word changed/inserted in the header, calculate the difference between the two numbers and list the count incrementally.
Headers in a file look like this:
----------[changed to 229-232]---------
-----------[inserted 294-296]----------
------------[changed to 861]-----------

I should grep for the word changed, also grep the numbers listed 229 and 232 and find their difference. The difference in the number of lines is the output. Similarly grep for inserted and the difference in the numbers. If the header contains just one number increment by one.
Output should be like:
Number of lines changed :4 (here 3 from first header and one from last header matching the word changed)
Number of lines inserted :2

Please help me, i am held up with this for long.
# 2  
Old 09-29-2009
no need to find the output for the headers ------------[changed to 861]-----------

??
# 3  
Old 09-29-2009
Perl pattern matching!!

Thanks for your reply!
This header simply means that only one line has been changed so i just need to increment by one for pattern in changed.
------------[changed to 861]-----------
# 4  
Old 09-29-2009
I dont have much idea about perl so i did in this way . you may need it.
code :

Code:
grep '^-' test|tr '[]-' '   '|sed 's/inserted/inserted to /g'|awk ' NF==3 {print $0,($3+1);next} {print $0}'|tr -s " "|awk '$1 == "changed" {print "numbers of line changed :",($4-$3);next} {print "numbers of line inserted :",($4-$3)}'


hope you wanted this.

regards,
Sanjay

Last edited by sanjay.login; 09-29-2009 at 08:48 AM..
# 5  
Old 09-29-2009
Here's one way to do it with Perl:

Code:
$
$ cat f1
----------[changed to 229-232]---------
blah blah
some stuff here
-----------[inserted 294-296]----------
and some more here
and more
------------[changed to 861]-----------
and yet some more...
not the last line.
----------[changed to 679-689]---------
line 11
-----------[inserted 297]----------
and this is line 13
----------[changed to 789-795]---------
line 15
-----------[inserted 299]----------
this is the last line.
$
$
$ ##
$ perl -lne 'if (/\[changed to (\d+)]/)       {$chgcnt++}
>            elsif (/\[changed to ([\d-]+)]/) {$chgcnt += abs(eval($1))}
>            elsif (/\[inserted (\d+)]/)      {$inscnt++}
>            elsif (/\[inserted ([\d-]+)]/)   {$inscnt += abs(eval($1))}
>            END {print "Number of lines changed : $chgcnt";
>                 print "Number of lines inserted: $inscnt"}' f1
Number of lines changed : 20
Number of lines inserted: 4
$
$


A tad shorter:

Code:
$
$ ##
$ perl -lne 'if (/\[changed to ([\d-]+)]/)  {$chgcnt += index($1,"-") == -1 ? 1 : abs(eval($1))}
>            elsif (/\[inserted ([\d-]+)]/) {$inscnt += index($1,"-") == -1 ? 1 : abs(eval($1))}
>            END {print "Number of lines changed : $chgcnt";
>                 print "Number of lines inserted: $inscnt"}' f1
Number of lines changed : 20
Number of lines inserted: 4
$
$


tyler_durden

Last edited by durden_tyler; 09-29-2009 at 02:10 PM..
# 6  
Old 09-29-2009
Here's another way to do it, as a perl script.

I do like the way that durden_tyler's works.
Some one better at perl than I might be able
to mash each line of the file down to the
three most needed values (changed or inserted
plus the one or two line values) as I have, in
fewer key strokes.

Code:
 
#!/bin/perl
open(FH, "/path/to_your/file") or die "Can't open file: $!";
%result = ();
while (<FH>) {
  chomp;
  s/\bto\b//;
  tr/-\[\] / /s;
  s/\s$//;
  $cnt = ($action, $val1, $val2) = split (' ');
  $result{$action}++ if $cnt == 2;
  $result{$action} += ($val2 - $val1) + 1 if $cnt == 3;
}
foreach $action ( keys %result ) {
  print "$action: $result{$action}\n";
}
close (FH)

Also, forgot to mention, and I may be wrong, as you certainly know
your data better than I do, but if you count the changed or inserted
lines including and between 229-232 that is 4 lines, not 3, so you'll
need to add one to the result to be accurate.

Like I said, you know your data better than I do, so I could be wrong
on you needing this, but I thought I'd point that out, just in case. ;-)

Last edited by rwuerth; 09-29-2009 at 01:11 PM..
# 7  
Old 09-30-2009
Perl pattern matching!!

Thanks guys for your serious effort, I got it in a way and am examining the other too. Thanks for the help. I will reply back soon with my queries.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Perl - Use of *? in Matching Pattern

I am using Perl version 5.8.4 and trying to understand the use of regular expression. Following is my code and output. $string = "Perl is a\nScripting language"; ($start) = ($string =~ /\A(.*?) /); @lines = ($string =~ /^(.*?) /gm); print "First Word (using \\A): $start\n","Line... (4 Replies)
Discussion started by: jnrohit2k
4 Replies

2. Shell Programming and Scripting

Pattern matching in Perl

Hi, I have a list of IP, eg : 192.168.0.15 192.168.0.24 192.168.2.110 192.168.2.200 And I would like the shortest pattern who match with '192.168.0' and '192.168.2' (without the last dot and number). (7 Replies)
Discussion started by: X-Or
7 Replies

3. Shell Programming and Scripting

Need help with perl pattern matching

My log file looks as given below, its actually a huge file around 1 GB and these are some of the line: conn=5368758 op=10628050 msgId=64 - RESULT err=0 tag=101 nentries=1 etime=0 conn=7462122 op=-1 msgId=-1 - fd=247 slot=247 LDAPS connection from 10.13.18.12:37645 to 10.18.6.45 conn=7462122... (5 Replies)
Discussion started by: sags007_99
5 Replies

4. Shell Programming and Scripting

Pattern Matching in PERL

I have a 2 files in .gz format and it consists of 5 million lines the format of the file would be gzcat file1.gz | more abcde aerere ffgh56 .. .. 12345 gzcat file2.gz | more abcde , 12345 , 67890, ffgh56 , 45623 ,12334 whatever the string is in the file1 should be matched... (3 Replies)
Discussion started by: aravindj80
3 Replies

5. Shell Programming and Scripting

Perl Pattern matching...

I am doing a file patterhn matching for a text file in PERL I am using this,,, but it says that no file is found $filepattern = '\d{1,4}.*A0NW9693.NDM.HBIDT.*.AD34XADJ.txt'; Can anyone help me out with Perl Pattern Matching concepts and how to do pattern matching for this txt file:... (4 Replies)
Discussion started by: msrahman
4 Replies

6. Shell Programming and Scripting

Perl Pattern Matching

Hello experts, I have a file containing the following text(shortened here). File Begin ---------- < # Billboard.d3fc1302a677.imagePath=S:\\efcm_T4 < Billboard.d3fc1302a677.imagePath=S:\\efcm_T4 --- > # Billboard.d3fc1302a677.imagePath=S:\\efcm_Cassini >... (2 Replies)
Discussion started by: nmattam
2 Replies

7. Shell Programming and Scripting

Perl -Pattern Matching help..!

Hi, I got doubt in Pattern matching, could you tell me how the following differs in action ?? if ( $line1==/$line2/ ) if ( $line1=~/$line2/ ) if ( $line1=~m/$line2/) What is the significance of '~' in matching. Thanks in advance CoolBhai (5 Replies)
Discussion started by: coolbhai
5 Replies

8. Shell Programming and Scripting

Perl Pattern Matching !!! Help

Hello I got the below one from in one of this forums For Ex: Loading File System Networking in nature now i need to extract the patterns between the words File and Networking : i.e. sample output: System cmd used : cat <file> | sed 's/.*File //' | sed 's/Closing.*$//' Actually... (0 Replies)
Discussion started by: maxmave
0 Replies

9. Shell Programming and Scripting

perl pattern matching

hi i am trying to get digits inside brackes from file , whose structure is defined below CREATE TABLE TELM (SOC_NO CHAR (3) NOT NULL, TXN_AMOUNT NUMBER (17,3) SIGN_ON_TIME CHAR (8) TELLER_APP_LIMIT NUMBER (17,3) FIL01 ... (2 Replies)
Discussion started by: zedex
2 Replies

10. Shell Programming and Scripting

pattern matching + perl question

i can only find the first occurance of a pattern how do i set it to loop untill all occurances have changed. #! /usr/bin/perl use POSIX; open (DFH_FILE, "./dfh") or die "Can not read file ($!)"; foreach (<DFH_FILE>) { if ($_ !~ /^#|^$/) { chomp; ... (1 Reply)
Discussion started by: Optimus_P
1 Replies
Login or Register to Ask a Question

Featured Tech Videos