| 
0
 | 
     1 # A program to implement arithmetic operations on tabular files data. The program takes three inputs:
 | 
| 
 | 
     2 # The first input is a TABULAR format file containing numbers only.
 | 
| 
 | 
     3 # The second input is a TABULAR format file containing numbers only.
 | 
| 
 | 
     4 # The two files must have the same number of columns and the same number of rows
 | 
| 
 | 
     5 # The third input is an arithmetic operation: +, -, *, or / for addition, subtraction, multiplication, or division, respectively 
 | 
| 
 | 
     6 # The output file is a TABULAR format file containing the result of implementing the arithmetic operation on both input files.
 | 
| 
 | 
     7 # The output file has the same number of columns and the same number of rows as each of the two input files.
 | 
| 
 | 
     8 # Note: in case of division, none of the values in the second input file could be 0.
 | 
| 
 | 
     9 
 | 
| 
 | 
    10 use strict;
 | 
| 
 | 
    11 use warnings;
 | 
| 
 | 
    12 
 | 
| 
 | 
    13 #variables to handle information of the first input tabular file
 | 
| 
 | 
    14 my $lineData1 = "";
 | 
| 
 | 
    15 my @lineDataArray1 = ();
 | 
| 
 | 
    16 my $lineArraySize = 0;
 | 
| 
 | 
    17 my $lineCounter1 = 0;
 | 
| 
 | 
    18 
 | 
| 
 | 
    19 #variables to handle information of the second input tabular file
 | 
| 
 | 
    20 my $lineData2= "";
 | 
| 
 | 
    21 my @lineDataArray2 = ();
 | 
| 
 | 
    22 my $lineCounter2 = 0;
 | 
| 
 | 
    23 
 | 
| 
 | 
    24 my $result = 0;
 | 
| 
 | 
    25 
 | 
| 
 | 
    26 # check to make sure having the correct number of arguments
 | 
| 
 | 
    27 my $usage = "usage: tables_arithmetic_operations.pl [TABULAR.in] [TABULAR.in] [ArithmeticOperation] [TABULAR.out] \n";
 | 
| 
 | 
    28 die $usage unless @ARGV == 4;
 | 
| 
 | 
    29 
 | 
| 
 | 
    30 #variables to store the names of input and output files
 | 
| 
 | 
    31 my $inputTabularFile1 = $ARGV[0];
 | 
| 
 | 
    32 my $inputTabularFile2 = $ARGV[1];
 | 
| 
 | 
    33 my $arithmeticOperation = $ARGV[2];
 | 
| 
 | 
    34 my $outputTabularFile = $ARGV[3];
 | 
| 
 | 
    35 
 | 
| 
 | 
    36 #open the input and output files
 | 
| 
 | 
    37 open (INPUT1, "<", $inputTabularFile1) || die("Could not open file $inputTabularFile1 \n"); 
 | 
| 
 | 
    38 open (INPUT2, "<", $inputTabularFile2) || die("Could not open file $inputTabularFile2 \n"); 
 | 
| 
 | 
    39 open (OUTPUT, ">", $outputTabularFile) || die("Could not open file $outputTabularFile \n");
 | 
| 
 | 
    40 
 | 
| 
 | 
    41 #store the first input file in the array @motifsFrequencyData1
 | 
| 
 | 
    42 my @tabularData1 = <INPUT1>;
 | 
| 
 | 
    43 	
 | 
| 
 | 
    44 #store the second input file in the array @motifsFrequencyData2
 | 
| 
 | 
    45 my @tabularData2 = <INPUT2>;
 | 
| 
 | 
    46 
 | 
| 
 | 
    47 #reset the $lineCounter1 to 0	
 | 
| 
 | 
    48 $lineCounter1 = 0;
 | 
| 
 | 
    49 
 | 
| 
 | 
    50 #iterated through the lines of the first input file 
 | 
| 
 | 
    51 INDEL1:
 | 
| 
 | 
    52 foreach $lineData1 (@tabularData1){
 | 
| 
 | 
    53 	chomp ($lineData1);
 | 
| 
 | 
    54 	$lineCounter1++;
 | 
| 
 | 
    55 	
 | 
| 
 | 
    56 	#reset the $lineCounter2 to 0
 | 
| 
 | 
    57 	$lineCounter2 = 0;
 | 
| 
 | 
    58 	
 | 
| 
 | 
    59 	#iterated through the lines of the second input file 
 | 
| 
 | 
    60 	foreach $lineData2 (@tabularData2){
 | 
| 
 | 
    61 		chomp ($lineData2);
 | 
| 
 | 
    62 		$lineCounter2++;
 | 
| 
 | 
    63 
 | 
| 
 | 
    64 		#check if the two motifs are the same in the two input files
 | 
| 
 | 
    65 		if ($lineCounter1 == $lineCounter2){
 | 
| 
 | 
    66 			
 | 
| 
 | 
    67 			@lineDataArray1 = split(/\t/, $lineData1);
 | 
| 
 | 
    68 			@lineDataArray2 = split(/\t/, $lineData2);
 | 
| 
 | 
    69 			
 | 
| 
 | 
    70 			$lineArraySize = @lineDataArray1;
 | 
| 
 | 
    71 			
 | 
| 
 | 
    72 			for (my $index = 0; $index < $lineArraySize; $index++){
 | 
| 
 | 
    73 				
 | 
| 
 | 
    74 				if ($arithmeticOperation eq "Addition"){
 | 
| 
 | 
    75 					#compute the additin of both values
 | 
| 
 | 
    76 					$result = $lineDataArray1[$index] + $lineDataArray2[$index];
 | 
| 
 | 
    77 				}
 | 
| 
 | 
    78 				
 | 
| 
 | 
    79 				if ($arithmeticOperation eq "Subtraction"){
 | 
| 
 | 
    80 					#compute the subtraction of both values
 | 
| 
 | 
    81 					$result = $lineDataArray1[$index] - $lineDataArray2[$index];
 | 
| 
 | 
    82 				}	
 | 
| 
 | 
    83 				
 | 
| 
 | 
    84 				if ($arithmeticOperation eq "Multiplication"){
 | 
| 
 | 
    85 					#compute the multiplication of both values
 | 
| 
 | 
    86 					$result = $lineDataArray1[$index] * $lineDataArray2[$index];
 | 
| 
 | 
    87 				}
 | 
| 
 | 
    88 				
 | 
| 
 | 
    89 				if ($arithmeticOperation eq "Division"){
 | 
| 
 | 
    90 					
 | 
| 
 | 
    91 					#check if the denominator is 0
 | 
| 
 | 
    92 					if ($lineDataArray2[$index] != 0){
 | 
| 
 | 
    93 						#compute the division of both values
 | 
| 
 | 
    94 						$result = $lineDataArray1[$index] / $lineDataArray2[$index];
 | 
| 
 | 
    95 					}
 | 
| 
 | 
    96 					else{
 | 
| 
 | 
    97 						die("A denominator could not be zero \n"); 
 | 
| 
 | 
    98 					}
 | 
| 
 | 
    99 				}
 | 
| 
 | 
   100 				
 | 
| 
 | 
   101 				#store the result in the output file
 | 
| 
 | 
   102 				if ($index < $lineArraySize - 1){
 | 
| 
 | 
   103 					print OUTPUT $result . "\t";
 | 
| 
 | 
   104 				}
 | 
| 
 | 
   105 				else{
 | 
| 
 | 
   106 					print OUTPUT $result . "\n";
 | 
| 
 | 
   107 				}
 | 
| 
 | 
   108 			}
 | 
| 
 | 
   109 			next INDEL1;
 | 
| 
 | 
   110 		}
 | 
| 
 | 
   111 	}
 | 
| 
 | 
   112 }	 
 | 
| 
 | 
   113 
 | 
| 
 | 
   114 #close the input and output files
 | 
| 
 | 
   115 close(OUTPUT);
 | 
| 
 | 
   116 close(INPUT2);
 | 
| 
 | 
   117 close(INPUT1); |