Perl command in bash


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl command in bash
# 36  
Old 04-01-2015
Quote:
Originally Posted by cmccabe
... it appears to be the way that the input file is being read by the perl script. Is that right?...
That is right.

Quote:
Originally Posted by cmccabe
...It was the way it was called... I see now that the < input and > output are not needed:

Code:
 perl matrix.pl "${id}".txt.hg19_multianno.txt  L:/NGS/3_BUSINESS/Matrix/Torrent/matrix_"${id}".txt

...
Yes, you got it.

(a)
When you invoke
Code:
perl my_program.pl < my_file.txt

your shell passes the content of the file "my_file.txt". So your Perl program works only with the content; it doesn't have to open the file.

(b)
When you invoke
Code:
perl my_program.pl my_file.txt

your shell passes the name of the file i.e. "my_file.txt". (Actually, it passes just a string, which happens to be the name of a file.)
Your Perl program will have to open the file first. Only then can it access the content of the file.

You were using method (a) earlier. I used method (b) in my post.

Quote:
Originally Posted by cmccabe
...However, the new file that is created only has the headers in it and doesn't carry over the data in the multianno.txt....
That's because the program is processing only one line - line number 1, or the header line. If you want it to process all lines, the required change is simple.
Check these pages for more information:
last - perldoc.perl.org
perlvar - perldoc.perl.org (Search for "$." in the box at the top right corner.)

# 37  
Old 04-01-2015
Would changing:

Code:
 
while (<FH>) {
          chomp;
          if ($. == 1) {
        }
}

to:

Code:
 
while (my $row = <FH>) {
      chomp $row; }
      }
}

work? Thank you Smilie.
# 38  
Old 04-01-2015
Does it work when you make that change?
# 39  
Old 04-01-2015
No that didn't work.... the left and the right are there but no middle. Thank you Smilie.
# 40  
Old 04-01-2015
The code has incorrect syntax so it shouldn't work.
Code:
while (my $row = <FH>) {
      chomp $row; }
      }
}

# 41  
Old 04-02-2015
The below seems to work, although it writes the header data to a file and outputs the data to the screen.

Code:
my $final_header;
      open (FH, "<", $input_file) or die "Can't open $input_file: $!";
      while (<FH>) {
          chomp;
         if ($. == 1) {
              $final_header = sprintf("%s\t%s\t%s\n", join("\t", @left), $_, join("\t",@right));
              last;
          }
      }
      close (FH) or die "Can't close $input_file: $!";
    
      # Once the final header is set, print it to the output file
      open (FH, ">", $output_file) or die "Can't open $output_file: $!";
      print FH $final_header;
      close (FH) or die "Can't close $output_file: $!";
	  
	  	  
	  # capture data
	  my $row_data;
	  open (RD, "<", $input_file) or die "Could not open $input_file: $!";

while( my $line = <RD>)  {   
    print $line;    
    last if $. == 2;
}

Code:
 
 perl matrix.pl del.txt.hg19_multianno.txt L:/NGS/3_BUSINESS/Matrix/Torrent/matrix_del.txt
Chr     Start   End     Ref     Alt     Func.refGene    Gene.refGene    GeneDetail.refGene      ExonicFunc.refGene      AAChange.refGene        PopFreqMax     1000G2012APR_ALL 1000G2012APR_AFR        1000G2012APR_AMR        1000G2012APR_ASN1000G2012APR_EUR        ESP6500si_ALL   ESP6500si_AA    ESP6500si_EA    CG46   common   clinvar clinvarsubmit   clinvarreference        Otherinfo
13      20763686        20763686        C       -       exonic  GJB2           frameshift deletion      GJB2:NM_004004.5:exon2:c.35delG:p.G12fs 0.011   .      ..       .       .       0.0074  0.0009  0.011   .


Last edited by cmccabe; 04-02-2015 at 12:51 PM.. Reason: changed code again
# 42  
Old 04-02-2015
Quote:
Originally Posted by cmccabe
The below seems to work, although it writes the header data to a file and outputs the data to the screen.

Code:
my $final_header;
      open (FH, "<", $input_file) or die "Can't open $input_file: $!";
      while (<FH>) {
          chomp;
         if ($. == 1) {
              $final_header = sprintf("%s\t%s\t%s\n", join("\t", @left), $_, join("\t",@right));
              last;
          }
      }
      close (FH) or die "Can't close $input_file: $!";
...
...    
...

...
The portion of the code in red color i.e. the "while" loop will iterate through your entire file - i.e. the first line (the header) and all the lines after that (the data).

But the "if" part in green color processes only one line.
Did you figure out why that is so?

Quote:
Originally Posted by cmccabe
...
Code:
...
      close (FH) or die "Can't close $input_file: $!";
    
       # Once the final header is set, print it to the output file
      open (FH, ">", $output_file) or die "Can't open $output_file: $!";
      print FH $final_header;
      close (FH) or die "Can't close $output_file: $!";
      
            
      # capture data
      my $row_data;
      open (RD, "<", $input_file) or die "Could not open $input_file: $!";

while( my $line = <RD>)  {   
    print $line;    
    last if $. == 2;
}

...
The part in red closes the input file after processing only one line.

The part in green writes to the output file.

The part in blue opens the input file again.
Why do you do that?
The "while" loop shown earlier is anyway iterating through your entire file.
Why not take advantage of that and do your processing for the header as well as the data? Why open the input file a second time?

Why not do something like this pseudo-code:

Code:
while we loop through each line of the file
begin
    -  if this is line 1 then
           do something for the header
    -  otherwise
          do something else for the data
end

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to run several bash commands put in bash command line?

How to run several bash commands put in bash command line without needing and requiring a script file. Because I'm actually a windows guy and new here so for illustration is sort of : $ bash "echo ${PATH} & echo have a nice day!" will do output, for example:... (4 Replies)
Discussion started by: abdulbadii
4 Replies

2. Shell Programming and Scripting

How to call a bash command from within a perl script?

In a bash script, one can call a perl command in the following manner, where "myperlcommand" is a perl command. perl -e 'myperlcommand(arguments)' perl -e 'print("UUUU"x4)' Now, how can one call a bash command from within a perl script? (Suppose that mybashcommand is a bash... (1 Reply)
Discussion started by: LessNux
1 Replies

3. UNIX for Dummies Questions & Answers

Running set options from the command line and bash command

I'm reading about debugging aids in bash and have come across the set command. It says in my little book that an addition to typing set you can also use them "on the command line when running a script..." and it lists this in a small table: set -o option Command Line... (5 Replies)
Discussion started by: Straitsfan
5 Replies

4. AIX

Typing "bash" at the command line spawns two bash processes

Server: IBM p770 OS: AIX 6.1 TL5 SP1 When one of our develoeprs types "bash" on the command line to switch shells, it hangs. For some reason, two bash processes are created....the first bash process spawns a second bash process in the same console, causing a hang. Anyone have any idea what... (2 Replies)
Discussion started by: wjssj
2 Replies

5. Shell Programming and Scripting

perl/unix: script in command line works but not in perl

so in unix this command works works and shows me a list of directories find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt but when i try running a perl script to run this command my $query = 'find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt';... (2 Replies)
Discussion started by: kpddong
2 Replies

6. Shell Programming and Scripting

Calling bash command in perl script

Hi, I have tried several times but failed, I need to call this script from the perl script. This one line script will be sent to /var/tmp/error Bash command: /usr/openv/netbackup/bin/admincmd/bperror -backstat -l -hoursago 12 |awk '{ print $19, $12, $14, $16}'|grep -vi default|sort >... (12 Replies)
Discussion started by: sQew
12 Replies

7. Shell Programming and Scripting

combine two perl lines into a single perl command

Hi Everyone, i have a string 00:44:40 so: $tmp=~ s/://gi; $tmp=~s/({2})({2})({2})/$1*3600+$2*60+$3/e; the output is 2680. Any way to combine this two lines into a single line? Thanks (4 Replies)
Discussion started by: jimmy_y
4 Replies

8. Shell Programming and Scripting

Mixing Perl with Bash

I am fiddling with a little script that will issue a shutdown command if the temperature on the CPU goes above a certain level. I started writing the script in Bash, and then thought I would like to use Perl to extract the detailed bits, but I am not sure if this is really practical. Basically I... (2 Replies)
Discussion started by: kermit
2 Replies

9. Shell Programming and Scripting

[Perl] Accessing array elements within a sed command in Perl script

I am trying to use a script to replace the header of each file, whose filename are stored within the array $test, using the sed command within a Perl script as follows: $count = 0; while ( $count < $#test ) { `sed -e 's/BIOGRF 321/BIOGRF 332/g' ${test} > 0`; `cat 0 >... (2 Replies)
Discussion started by: userix
2 Replies

10. Shell Programming and Scripting

passing variable from bash to perl from bash script

Hi All, I need to pass a variable to perl script from bash script, where in perl i am using if condition. Here is the cmd what i am using in perl FROM_DATE="06/05/2008" TO_DATE="07/05/2008" "perl -ne ' print if ( $_ >="$FROM_DATE" && $_ <= "$TO_DATE" ) ' filename" filename has... (10 Replies)
Discussion started by: arsidh
10 Replies
Login or Register to Ask a Question