pattern matching problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting pattern matching problem
# 1  
Old 10-26-2007
pattern matching problem

I have a file with the following contents;

NEW 85174 MP081 /29OCT07
CNL 85986 MP098 /28OCT07
NEW 86014 MP098 /28OCT07
NEW 86051 MP097 /27OCT07
CNL 86084 MP097 /27OCT07


Now I have to retrieve all lines that start with NEW and where the next line starts with CNL and where the MP codes are the same in both lines.

So it has to return the last two lines from this example.
# 2  
Old 10-26-2007
This may not be the efficient solution:
Code:
#!/usr/bin/perl
# get_lines.pl
use strict;
my $check_next_line = "no";
my ($new_line, $mp);
while (<>) {
    chomp;
    if (/^NEW/) {
        $new_line = $_;  # save the line beginning with word NEW
        $check_next_line = "yes";
        $mp = (split (/\s+/, $_))[2];  # save the field containing MP code
        next;
    }
    elsif (/^CNL/) {
        if ($mp eq (split (/\s+/, $_))[2]) {
            print $new_line, "\n";
            print;
            print "\n";
        }
    }
    $check_next_line = "no";
}

Run this script as:
Code:
perl get_lines.pl new_file

# 3  
Old 10-26-2007
With awk:

Code:
awk '/^CNL/&&x=="NEW"$3&&$0=y RS$0
{x=$1$3;y=$0}' filename

Use nawk or /usr/xpg4/bin/awk on Solaris.
# 4  
Old 10-26-2007
Ok, great both solutions work.
# 5  
Old 10-26-2007
With awk it took me 3 hours and no result and with Java 30 mins and result ... the awk solution is much smaller though but I can't understand it.

Code:
import java.io.*;


public class GetLine {

	private String prevWord = "";
	private String prevLine = "";
	
	private void parse(String fileName){
		try {
	        BufferedReader in = new BufferedReader(new FileReader(fileName));
	        System.out.println("Reading file: " +fileName);
	        String line = "";
	        while ((line = in.readLine()) != null) {
	        	//System.out.println(str);
	        	String [] word = line.split("[\t]");
	        	//System.out.println(word[2]);
	        	if ( prevWord.equals(word[2])){
	        		System.out.println(prevLine);
	        		System.out.println(line);
	        	}
	        	prevWord = word[2];
	        	prevLine = line;
	        }
	        in.close();
	    } catch (IOException e) {
	    	System.err.println(e);
	    }
	}
	
	public static void main(String [] args){
		GetLine getLine = new GetLine();
		getLine.parse(args[0]);
	}
	
}

anyone a solution in C perhaps? Just for fun?
# 6  
Old 10-26-2007
Hi, rein.

You mentioned the awk and Java. It looked like the perl script from Yogesh Sawant would work -- did you time it?

This looks mostly IO bound, so except for coding the algorithm, I would not expect drastically different times. For example, my experience is that perl is very close to c for IO cases, but not so close for arithmetic-dense code.

The perl might be made a bit more efficient by using the suffix "o" for matching constant patterns, and possibly not splitting more fields than needed -- but I'd think those are making very small contributions ... cheers, drl
# 7  
Old 10-26-2007
Quote:
[...]
With awk it took me 3 hours and no result and with Java 30 mins and result
[...]
Quote:
Originally Posted by drl
[...]
It looked like the perl script from Yogesh Sawant would work -- did you time it?
[...]

I believe those are not execution timings Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Pattern matching problem

if i have to do pattern match for file name with digit alphanumeric value like this File_1234.csv File_12sd45rg.csv i am using this File_*.csv and File_*.csv for digit pattern match. when i am doing pattern match for the digit then both alphanumeric match and digit match is coming. ... (3 Replies)
Discussion started by: ramsavi
3 Replies

2. Shell Programming and Scripting

Pattern matching problem

Hi I need a bash script that can search through a text file for all lines starting with 71502FSC1206 on every line it finds starting with this I need to place a letter F at the 127 position on that line. Thanks Paul (6 Replies)
Discussion started by: firefox2k2
6 Replies

3. Shell Programming and Scripting

Pattern matching and format problem

Hi I need a bash script that can search through a text file and when it finds 'FSS1206' I need to put a Letter F 100 spaces after the second instance of FSS1206 The format is the same throughout the file I need to repeat this on every time it finds the second 'FSS1206' in the file I have... (3 Replies)
Discussion started by: firefox2k2
3 Replies

4. Programming

pl sql . pattern matching problem

hi everyone i am facing a strange problem declare v_var number(10); begin if( regexp_like('RCDORMS_MMS_*_DAR','RCDORMS_MMS_*_DAR')) then v_var:=20; dbms_output.put_line(v_var); end if; end; / please tell me what's the wrong thing in this expression.. as i am not able to get... (1 Reply)
Discussion started by: aishsimplesweet
1 Replies

5. Shell Programming and Scripting

pattern matching problem

# cat email.txt | grep -i "To:" To: <test@example.com> # cat email.txt | grep -i "Subject" Subject: Test Subject: How are you. I need to print only test@example.com from To field need to eliminate "< & >" from To field and need to print entire subject after Subject: It should be #... (7 Replies)
Discussion started by: mirfan
7 Replies

6. Shell Programming and Scripting

Problem extracting just a part of a matching pattern

Hello everyone, this is my first post so please give me a hand. I apologize for my English, I'll try to be clear with my request. I need to write a script (Bash) which finds all the variables defined in the file .h of the folder and then writes the name of the files .c where these variables are... (1 Reply)
Discussion started by: paxilpaz
1 Replies

7. Shell Programming and Scripting

problem using sed for pattern matching

if abc.sh is 192.168.1.41 then the output that i get is v5c01 my code is sed 's/192.168.1.4/v5c0/g s/192.168.1.41/acc1/g' abc.sh 2>&1 | tee abc.sh i want to find 192.168.1.4 and replace it with v5c0 and find 192.168.1.41 and replace it with acc1 and i want to do it using sed (5 Replies)
Discussion started by: lassimanji
5 Replies

8. Shell Programming and Scripting

Pattern Matching problem in UNIX

Hello All, I need help I have a problem in searching the pattern in a file let us say the file contains the below lines line 1 USING *'/FILE/FOLDER/RETURN') ................. ................. line 4 USING *'/FILE/FOLDER/6kdat1') line 5 USING... (2 Replies)
Discussion started by: maxmave
2 Replies

9. Shell Programming and Scripting

pattern matching problem

FilesToBackup='*.track* *.xml *.vm* *.gz Trace* TRACE* "*core*" *.out fcif_data_* esi_error_* *.rollback *.sed R.* APStatus_* log* *.output* send_mail* downenv* check_env* intaspurge_db_* sqlnet.log *.rpt *.html *.csv "*TSC*"' and i am using it like this- echo Moving files from $(pwd): ... (2 Replies)
Discussion started by: namishtiwari
2 Replies

10. Shell Programming and Scripting

problem with CASE pattern matching

I am using ksh on a HP Ux. I have a simple script but am having problem with the case statement:- #!/usr/bin/sh Chl=”SM.APPLE_SWIFT_DV” LoConfirm=”” case $chl in ) LoConfirm=”Using channel at Building 1” echo “test conditon1” echo $LoConfirm;; ) LoConfirm=”Using... (2 Replies)
Discussion started by: gummysweets
2 Replies
Login or Register to Ask a Question