2015-08-04 2 views
0

Мне нужно проверить, нет ли двух файлов пустым. Если они есть, напишите «-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 

ответ

1

подходящий способ проверить, является ли файл пустой использует -s не -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                    
0

Этот вопрос был задан ранее , См. here

Вы можете сделать так:

if [[ -s $FILE ]] ; then 
echo "$FILE has data." 
else 
echo "$FILE is empty." 
fi ; 
Смежные вопросы