[2] | 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); |
---|