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