如果文件为空,则将文本写入第一行

时间:2015-08-04 17:59:07

标签: linux unix if-statement echo average

我需要检查两个文件是否为空。如果是,则将“-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

2 个答案:

答案 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 ;