----- Original Message ----- From: "Li, Aiguo (NIH/NCI)" <[EMAIL PROTECTED]> Date: Monday, January 24, 2005 5:14 pm Subject: How to go back to a line and do something with it in an input fil e?
> hello, all. Hello Seems like there is a problem with your data, or problem is miss-read. See comments in data. > > I need to transform the column3 data from an input file as > indicated below > into three values: 0, 0.4, 1. > if there are more than 3 NoCall continuously in column3, change > NoCall into > "1". this option has the highest precedence. > for the rows where column2 is between 52 and 105 (range from a file), > transform the values in column3 into "0.4". > for the rows outside of this region, change the values in column3 > into "0" > > print into an output file. > > I am struggling with how to go back to the line to change the > column 3 after > 3 consecutive NoCall has been counted??? > > I currently read the input data into an array and used this line > to go back > to the beginning of first NoCall line: my $nocalline = > $contents[$line_num - > 3]; > Perl does not like it and an error message says: ""my" variable > $nocallinemasks earlier declaration in same scope a > line 38. Use of implicit split to @_ is deprecated at > trynocall.pl line 38. > syntax error at trynocall.pl line 38, near ");" > > Can anyone give some hints? > > Thanks > > Aiguo > > > input data is: output data should be: > ====================== ======================== > 1 22 AA 1 22 0 > 1 24 AA 1 24 0 > 1 26 NoCall 1 26 0 > 1 27 BB 1 27 0 > 1 30 AB 1 30 0 > 1 35 NoCall 1 35 1 > 1 40 NoCall 1 40 1 ^ ony 2 ahead have a "NoCall" ahead; Shouldnt this change to "1 40 0" ? > 1 41 NoCall 1 41 1 same problem in this raw and next one > 1 42 NoCall 1 42 1 > 1 48 AB 1 48 0 > 1 50 AB 1 50 0 > 1 52 BB 1 52 0.4 > 1 53 NoCall 1 53 0.4 > 1 55 NoCall 1 55 0.4 > 1 56 BB 1 56 0.4 > 1 66 AA 1 66 0.4 > 1 70 NoCall 1 70 1 > 1 90 NoCall 1 90 1 > 1 99 NoCall 1 99 1 > 1 100 NoCall 1 100 1 > 1 101 NoCall 1 101 1 > 1 103 AA 1 103 0.4 > 1 105 BB 1 105 0.4 > 2 22 AA 2 22 0 > 2 24 BB 2 24 0 > 2 26 AB 2 26 0 > 2 27 BB 2 27 0 > 2 30 AA 2 30 0 > 2 35 AA 2 35 0 > 2 40 AA 2 40 0 > > > the code I have > ================= > #!usr/local/bin/perl > > use strict; > use warnings; > > open (DATA, "C:/Aiguo_2004/SNP_Johnpark/work > files/summary/testnocall1.txt")or die "Can not open file \n"; > open (LOH, "C:/Aiguo_2004/SNP_Johnpark/work > files/summary/loh.txt") or die > "Can not open file \n"; > open (OUT1, ">C:/perl/work/nocallout.txt") or "die can not open > file \n"; > > my @contents = <DATA>; > my $chro_num; > my $lohbegin; > my $lohend; > my $line_num = 0; > > > while(my $lohline = <LOH>) #this file contain regions for changing > to 0.4 > { > ($chro_num, $lohbegin, $lohend) = split(/\t/, $lohline); > foreach my $line (@contents) > { > while($line =~ /^[1..9]/) > { > $line_num++; > #print $line_num; > (my $chro, my $position, my $call) = split (/\t/, $line); > > if(($chro_num == $chro)&&($position >= $lohbegin) && > ($position <= $lohend)) > { > call = 0.4; > unless($call =~ "NoCall") > { > my $n++; > my $m++; > > if($n >= 3) > { > my $nocalline = $contents[$line_num - 3]; > my ($nocall_chro, $nocall_begin, $nocall = > split(/\t/, $nocalline); > print "Nocall chro = $nocall_chro, Nocall > begin = $nocall_begin \n"; > $nocall = "Nocall"; > } > #else{$call = 0.4;} > print $call; > $contents[$line_num] = join('\t', $chro, $position, > $call); > } > } > #print "Chro:$chro, Position:$position, call=$call\n"; > } > #print @contents; > } > } > > close DATA; > close OUT1; > close LOH; > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > <http://learn.perl.org/> <http://learn.perl.org/first-response> > > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>