我需要检查两个文件是否为空。如果是,则将“-999”写入文件,否则对文件中的数字运行平均值。
以下是我一直在尝试使用的编码:
代码:
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
file_all的内容:
76
76
78
79
75
76
77
78
76
答案 0 :(得分:1)
检查文件是否为空的适当方法是使用-s not -z(检查给定字符串是否为零)。
顺便说一下,你的代码似乎计算了中位数,而你说你想要计算平均值,这是不一样的。我已经重写了你的脚本来计算平均值,使用bash脚本而不是awk。#!/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
答案 1 :(得分:0)
之前已经提出过这个问题,请参阅here
你可以这样做:
if [[ -s $FILE ]] ; then
echo "$FILE has data."
else
echo "$FILE is empty."
fi ;