0

次のような入力があります

*KEYWORD
$TIME_VALUE = 9.9999993e-004
$STATE_NO = 2
$Output for State 2 at time = 0.001
*END
$NODAL_RESULTS
$RESULT OF Resultant Displacement
721810 1.7188E-2
721812 6.1973E-2
721825 1.1481E+0
721827 1.0962E+0
721852 5.1831E-1
721854 1.3085E-2
721867 1.1077E+0
 .        .
 .        .
 .        .

列 2 の値の最大値とその平均値を見つける必要があります。次に、最大値の最初の列にある数値も出力する必要があります。

最大値と平均値の計算に次のコードを使用しましたが、ゼロによる除算が行われました。

awk: cmd. line:5: fatal: division by zero attempted

コードは次のとおりです。

# 1.k is the input file name.
sed  -n '/^[0-9]\{1\}/p' 1.k  > 2.k   # delete all lines not starting with number
mv 2.k 1.k
sed  -i -e '/^$/d' 1.k                # delete all lines that are empty
#sed -i -e  's/^[ \t]*//;s/[ \t]*$//' 1.k  

awk 'BEGIN{min=999}
{a[NR]=$0;if($2<min){min=$2;m[1]=NR;}if($2>max){max=$2;m[2]=NR;}m[2]+=$2;}
END{print "Min:"a[m[1]];
print "Max:"a[m[2]];
print "Number Of Nodes:" NR;
print "Avg:"m[3]/NR}' 1.k

誰でもこの問題で私を助けることができますか?

よろしく、

4

5 に答える 5

0

simple-r ソリューションを試してください:

perl -walne 'print $F[1] if /^\d/' | r summary -

Simple-r は、コマンド ラインで高速な統計分析を行うための R ラッパーです。次の場所にあります。

https://code.google.com/p/simple-r/

于 2013-10-01T16:59:28.910 に答える
0

最初に数値以外の情報を除外する場合、このawkスクリプトは次のようにする必要があります。

awk 'BEGIN{max=-999}\
{\
  col1[NR]=$1;\
  col2[NR]=$2;\
  if($2>max){max=$2;imax=NR};\
  sum+=$2\
}\
END{print col1[imax]" "col2[imax]" average: "sum/NR}' yourinputfile
于 2012-08-24T12:57:08.987 に答える
0

計算.awk:

{ 
  sum += $2  
  if (NR == 1)  {   
    min = max = $2
    minv= maxv= $1
  }
  if (min > $2) { min = $2; minv = $1 }
  if (max < $2) { max = $2; maxv = $1 }
}
END { 
  print "Min: " minv ", " min 
  print "Avg: " sum / NR  
  print "Max: " maxv ", " max 
  print "# Nodes: " NR
}
于 2012-08-24T12:41:27.600 に答える
0

Perl ソリューション:

<1.k perl -ne 'next unless ($key, $val) = /^([0-9]+)\s+([-+E.0-9]+)/;# Only process the important lines.
               if ($val > $max) {                                    # New maximum.
                   $max = $val;
                   @maxk = $key;
               } elsif ($max == $val) {                              # The maximum appears more than once.
                   push @maxk, $key;
               }
               $sum += $val;
               $count++;
           } {
               print "MAX: $max at @maxk, AVG: ", $sum / $count ,"\n"; '
于 2012-08-24T12:38:51.167 に答える
0

試行錯誤した結果、うまくいくことがわかりましたが、問題の最適な解決策ではないと思います。

sed -i -e  's/^[ \t]*//;s/[ \t]*$//' 1.k
sed  -n '/^[0-9]\{1\}/p' 1.k  > 2.k
mv 2.k 1.k
sed  -i -e '/^$/d' 1.k  



awk 'BEGIN{min=999}

{a[NR]=$0;if($2<min){min=$2;m[1]=NR;}if($2>max){max=$2;m[2]=NR;}m[3]+=$2;}

END{     print "Max:"a[m[2]];     
     print "Min:"a[m[1]];     
    print "Number Of Calls:" NR;  
    print "Avg:"m[3]/NR}' 1.k   > result   

貴重なご提案をいただき、ありがとうございます。

于 2012-08-24T14:01:16.647 に答える