【问题标题】:If a File is Empty, Write Text to First Line如果文件为空,则将文本写入第一行
【发布时间】:2015-10-27 06:17:56
【问题描述】:

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

【问题讨论】:

    标签: linux unix if-statement echo average


    【解决方案1】:

    这个问题之前有人问过,见here

    你可以这样做:

    if [[ -s $FILE ]] ; then
    echo "$FILE has data."
    else
    echo "$FILE is empty."
    fi ;
    

    【讨论】:

      【解决方案2】:

      检查文件是否为空的适当方法是使用 -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                                                                              
      

      【讨论】:

        猜你喜欢
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 2021-04-25
        • 2013-10-18
        • 2013-04-09
        相关资源
        最近更新 更多