Perl how to move pointer to previous line in a txt file?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl how to move pointer to previous line in a txt file?
# 1  
Old 01-24-2008
Perl how to move pointer to previous line in a txt file?

I have a text file that has blocks of text. Each block starts with ### and ends with End_###.
I wrote a perl script to search a string from line 2 (ignore any line starts with ###) of each block
if matched, need to print that whole block. According to the input file in below, it will print blocks #02, #04, #05.
Here is my question, I have no problems matching the SEARCH_STR, but once matched, how do I move back previous lines?
e.g. in block #02, matched in line 3, but I need to print lines 1 & 2.

Thanks in advance for any help!

MY SCRIPT:
=========
#!/46020/local/bin/perl -w
#
if ($#ARGV != 0) {
print "You must provide a search criteria.\n";
exit;
}
my $query = $ARGV[0];
my $INPUT = "/mypath/inputFILE.txt";
my $line;
my $tag = 0;
my @results = ();

open (FILE, "<$INPUT") or die "Cannot open '$INPUT' file: $!";
while ($line = <FILE>) {
next if ($line =~ /^#[0-9][0-9].* - / || $line =~ /^\s*$/);
if ($line =~ /$query/i) {
$tag = 1;
}
if ($line =~ /^End_#/ && $tag == 1) {
push (@results,$line) if ($tag == 1);
$tag = 0;
}
push (@results,$line) if ($tag == 1);
}
close (FILE);
print "@results\n";
exit;


INPUTFILE:
========
#01 - block start line here
some text here
more text here
more lines
more lines
more lines
End_#01

#02 - block start line here
some text here
this line contains the SEARCH_STR and something
more lines
more lines
End_#02

#03 - block start line here
some text here
more text here
more lines
more lines
more lines
End_#03

#04 - block start line here
some text here
more lines
more lines
the SEARCH_STR is here and something
some text here
more lines
more lines
more lines
End_#04

#05 - block start line here
some text here
more lines
the SEARCH_STR is here and something
more lines
End_#05


#06 - block start line here
some text here
more text here
more lines
more lines
more lines
End_#06
# 2  
Old 01-24-2008
Java

Try something like this:
Code:
#!/46020/local/bin/perl -w
$/="\n\n";
while (<STDIN>) { if (/$ARGV[0]/) { print $_ }}

./scriptname.pl SEARCH_STR < /mypath/inputFILE.txt
# 3  
Old 01-24-2008
If Smiling_Dragons suggestion does not work, you can use the Tie::File module, which allows you to read and write to a file just like a perl array. See the Tie::File documentation for usage details. It's also a core module so you should have it installed already. If you get stuck, post back.
# 4  
Old 01-25-2008
Just want to clarify, according to the inputFILE.txt, when run the script with the SEARC_STR it will print #02, #04, #05 blocks. e.g. scriptname search.
My code able to print matched plus following lines up to End_###, but I need a way to print lines before matched in that block.

Thank you.
# 5  
Old 01-25-2008
Yes, I think we both understood that requirement, and both suggestions can be used to do what you want. If you are familiar with looping through perl arrays using subscripts: $array[n] then using Tie::File will be pretty straight forward once you read the documentation.

S_M's suggestion reads the file in chunks, not line by line, and looks like it should work although the last match might fail if there isn't two newlines at the end of the file. You will have to try it and see or maybe he can clear that up.
# 6  
Old 01-27-2008
Quote:
Originally Posted by KevinADC
S_M's suggestion reads the file in chunks, not line by line, and looks like it should work although the last match might fail if there isn't two newlines at the end of the file. You will have to try it and see or maybe he can clear that up.
I think it'll be ok with a normal file termination - I tried it on a single newline and it looked alright but I havn't put a lot of testing into it for sure Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Move a TXT file greater or equal 355 MB with its corresponding .LST file

Good morning, i need your help please I need to move a .TXT file greater or igual 355 MB and its correspondent .LST file in a non recursive way The operating system is: uname -a SunOS server01c 5.10 Generic_144488-01 sun4u sparc SUNW,SPARC-Enterprise For example: rw-r--r-- 1 xptol ... (8 Replies)
Discussion started by: alexcol
8 Replies

2. UNIX for Dummies Questions & Answers

Split Every Line In Txt Into Separate Txt File, Named Same As The Line

Hi All Is there a way to export every line into new txt file where by the title of each txt output are same as the line ? I have this txt files containing names: Kandra Vanhooser Rhona Menefee Reynaldo Hutt Houston Rafferty Charmaine Lord Albertine Poucher Juana Maes Mitch Lobel... (2 Replies)
Discussion started by: Nexeu
2 Replies

3. Shell Programming and Scripting

Need to append the date | abcddate.txt to the first line of my txt file

I want to add/append the info in the following format to my.txt file. 20130702|abcd20130702.txt FN|SN|DOB I tried the below script but it throws me some exceptions. <#!/bin/sh dt = date '+%y%m%d'members; echo $dt+|+members+$dt; /usr/bin/awk -f BEGIN { FS="|"; OFS="|"; } { print... (6 Replies)
Discussion started by: harik1982
6 Replies

4. Shell Programming and Scripting

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

I need to read the contents of a file. Then I need to grep for a keyword and replace part of the grepped line based on the condition of previous and present line. Example input file: V { port1 = P; port2 = 0; shift_port = P0; /* if next shift_port is P0 I need... (9 Replies)
Discussion started by: naveen@
9 Replies

5. Shell Programming and Scripting

sed: how to move matched pattern to end of previous line

Hello, I'm new to this forum. I've been doing a lot of sed work lately and have found many useful tips on this forum. I've hit a roadblock in a project, though, and could really use some help. I have a text file with many lines like the following, i.e., some lines begin with a single word... (3 Replies)
Discussion started by: paroikoi
3 Replies

6. UNIX for Dummies Questions & Answers

Move txt file to with current date appended to filename

I have multiple txt files which begin with the word "orders" in folder C:\source. I need to move the files to folder C:\dest and rename them to "process_<date>_<count>" So for example , if there are 3 files ordersa.txt , ordersb.txt and ordersc.txt in C:\source , after running the script I want... (7 Replies)
Discussion started by: johannd
7 Replies

7. Shell Programming and Scripting

Move txt file to with current date appended to filename

I have multiple txt files which begin with the word "orders" in folder C:\source. I need to move the files to folder C:\dest and rename them to "process_<date>_<count>" So for example , if there are 3 files ordersa.txt , ordersb.txt and ordersc.txt in C:\source , after running the script I want... (1 Reply)
Discussion started by: johannd
1 Replies

8. Shell Programming and Scripting

[PERL] Cannot stat or move filename - £££F3AERO££.txt

Scenario: Users drop files into a directory which is regularly polled by my PERL process. On detecting a file my process will move it from the poll dir to a working directory. A user created a file with a £ symbol in the filename and my process now fails. e.g £££F3AERO££.txt ... (1 Reply)
Discussion started by: thefal9
1 Replies

9. Shell Programming and Scripting

Move files one at the time and wait until the previous file is handled

I'm a novice at unix and need it more and more to do my work. I seem running into problems getting this script "attempt" to work: I need to copy all files in a directory, which is containing 22000 files, into a directory one level up. There a tool monitors the content of the dir and processes... (2 Replies)
Discussion started by: compasscard
2 Replies

10. Programming

how to move file pointer to a particular line in c

Hello experts, I ve a text file I want to go to particular line . what is the best way to do this in c ? I am tried as follows fseek ( fh, pos, SEEK_SET); but this functions moves the file pointer according to a number of bytes. Unfortunately I don't know the exact byte... (7 Replies)
Discussion started by: user_prady
7 Replies
Login or Register to Ask a Question