I need to check to see if two files are empty. If they are, then write “-999” to the file, else run an average on the numbers within the file.
Here is the coding I’ve been trying to use:
Code:
JavaScript
x
if [[ ! -z file1 ]] || [[ ! -z file2 ]]
then
echo "-999" > file_avg
else
cat file1 >> tmp
cat file2 tmp > file_all
cat file_all | awk 'BEGIN {c = 0; sum = 0;} $1 ~ /^[0-9]*(.[0-9]*)?$/
{a[c++] = $1; sum += $1;} END {avg = sum / c; if( (c % 2) == 1 ) {median = a[ int(c/2) ];}
else {median = ( a[c/2] + a[c/2-1] ) / 2;} OFS="t"; print avg;}' file_all
> file_avg
fi
Contents of file_all:
JavaScript
76
76
78
79
75
76
77
78
76
Advertisement
Answer
the appropriate way to check whether a file is empty is using -s not -z (which checks whether the given string is zero).
BTW, your code seems to calculate the median, while you state that you want to calculate the average, which is not the same. I’ve rewritten your script to calculate the average by using bash scripting and not awk.
JavaScript
#!/bin/bash
nlines=0
total=0
if test -s file1; then
while read value; do
let total=total+value
let nlines=nlines+1
done < file1
fi
if test -s file2; then
while read value; do
let total=total+value
let nlines=nlines+1
done < file2
fi
if test "${nlines}" -eq "0"; then
echo "-999" > file_avg
else
let average=total/nlines
echo $average > file_avg
fi