Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

script help

39 views
Skip to first unread message

rvae...@gmail.com

unread,
Oct 19, 2012, 5:37:03 PM10/19/12
to

I wanted to read a file and select the first 2 characters and if they are 9A or 7A
I want to zero out columns 18 to 22 and 25 to 29.

If this can be done in Perl and Bash.

Can someone assist please. thanks

Ben Morrow

unread,
Oct 19, 2012, 6:43:21 PM10/19/12
to

Quoth rvae...@gmail.com:
>
> I wanted to read a file and select the first 2 characters and if they
> are 9A or 7A
> I want to zero out columns 18 to 22 and 25 to 29.

What have you tried? I would probably use sysopen/read/write for this,
so

perldoc -f sysopen
perldoc -f sysread
perldoc -f syswrite
perldoc -f substr

Ben

Jim Gibson

unread,
Oct 19, 2012, 9:05:05 PM10/19/12
to
In article <0540ec78-bd7a-430a...@googlegroups.com>,
Is your file text or binary? What do you mean by "zero out"?

Assuming that 1) your are talking about ASCII text and 2) the
replacement characters are ASCII '0', here is a short program that
demonstrates testing each line, replacing characters in the line
depending upon what the first two characters are, and printing the
result. If you mean something else, please let us know:

#!/usr/bin/perl
use strict;
use warnings;
while( my $line = <DATA> ) {
if( $line =~ /^[79]A/ ) {
substr($line,18,5) = '00000';
substr($line,25,5) = '00000';
}
print $line;
}
__DATA__
1234566890123456689012345668901234566890
7A34566890123456689012345668901234566890
8234566890123456689012345668901234566890
9A34566890123456689012345668901234566890
x9A34566890123456689012345668901234566890
1234566890123456689012345668901234566890
abcdefghijklmnopqrstuvwxyz0123456789


This program uses the magic <DATA> file read operator to read data
lines from the end of the program. In a real program, you would open an
external file using the open function:

open( my $in, '<', $myfile ) or die("Can't open $myfile: $!");

and then use $in in the read operation:

while( my $line = <$in> ) {

You would also want to open a new file:

open( my $out, '>', $newfile ) or
die("Can't open $newfile for writing: $!");

and print to the new file handle instead of system output:

print $out $line;

See if you can put all of that together and write your own program.
Post your program here if you have problems.

Good luck!

--
Jim Gibson

SSS Develop

unread,
Oct 22, 2012, 11:29:39 AM10/22/12
to
This is possible - can you please state your exact problem. Try to provide possible input file and expected output file

---sss

ccc31807

unread,
Nov 9, 2012, 6:07:28 PM11/9/12
to
Assuming that you have some kind of delimited file, you can do it like this (in pseudocode)

open infile
open outfile
while (<infile>)
{
if(first two characters don't match /[79]A/)
then write the line to the outfile
else
convert the line to an array
set the array elements [18-22][25-29] to 0
join the array back to a line
write the line to the outfile
}
close infile
close outfile

0 new messages