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); |
---|