選択したファイルの平均化と移動

選択したファイルの平均化と移動

私は、次のように、ディレクトリ名に基づいて名前付きASCIIテーブルを含む複数のディレクトリを持っています。

a1/a1.txt
a2/a2.txt
a3/a3.txt
a4/a4.txt
b1/b1.txt
b2/b2.txt
b3/b3.txt
b4/b4.txt

各ファイルの4列目の平均(so)と(so)を計算して4つの異なるファイルを選択し、a平均が最も高いテーブルを別のディレクトリに移動します。baa1.txt a2.txt a3.txt a4.txtbb1.txt b2.txt b3.txt b4.txt

したがって、次のような場合:

a1.txt average value = 1
a2.txt average value = 0.25
a3.txt average value = 2
a4.txt average value = 1.15
b1.txt average value = 3
b2.txt average value = 1.7
b3.txt average value = 0.25
b4.txt average value = 2

次に、a3.txtおよびをb1.txtリモートディレクトリに移動する必要があります。

次のコードがあります。

for x in a b
do
  RESULT=$(awk '{x+=$4} END{print x/NR, FILENAME}' ${x}[1-4]/${x}[1-4].txt | sort -n -r| head -1)
  highest="$(echo $RESULT | cut -d ' ' -f1 )"
  hifile="$(echo $RESULT | cut -d ' ' -f2 )"
  echo "highest was $highest in $hifile"
  cp "$hifile" "high_dis/${x}.txt"
done

ただし、このコードは4つのファイルの平均を計算し、最後のファイル(a4.txtsum b4.txt)をコピーします。

希望の出力を取得する方法を知っている人はいますか?

ベストアンサー1

あなたの問題は次の事実によって引き起こされますawk はすべての入力ファイルを読み込んだ後にのみ END 節に到達します。

ループの最初の行をfor次に置き換えると問題が解決します。

RESULT=$(awk 'BEGIN{curr_f=FILENAME; nr=1} {if(curr_f!=FILENAME){if(mean > max_mean){max_mean=mean; f=curr_f} curr_f=FILENAME; nr=0; sum=0} } { sum+=$4; nr++; mean=sum/nr }  END{if(mean>max_mean){print mean, FILENAME}else{print max_mean, f}}' ${x}[1-4]/${x}[1-4].txt )

おすすめ記事