awkを使用してディレクトリ内のファイルを繰り返します。

awkを使用してディレクトリ内のファイルを繰り返します。

hotel_72572.datなどの他のファイルを含むReviews_folderがあります。

各ファイルには、次のように構成された多くのコメントが含まれています。

...
<Overall>4
...

私の目標は、averagereviews.shスクリプトを使用して、各ファイル(ホテル)のすべてのレビューの平均総数を計算することです。以下を実行すると、./averagereviews.sh path_to_reviews_folder 次のような結果が出力されます。

hotel_11212.dat 3.51
hotel_2121.dat 2.62
hotel_31212.dat 2.43
...

私のスクリプトは次のとおりです

#!/bin/bash
cd "$1" || exit 1
for file in "$1"; do
awk 'count+=sub(/<Overall>/, ""){sum+=$0}END{print sum/count}' file;
done

問題は、ファイルをディレクトリとして認識せず、hotel_*.datを入れると、各ファイルではなくreview_folder内のすべての既存のファイルの平均を計算することです。

ベストアンサー1

シングルawkスクリプト(forループおよびマルチawkコールなし):

入力ファイルの例:

$ head reviews_folder/hotel_*.dat
==> reviews_folder/hotel_111.dat <==
<Overall>1
<Overall>4
<Overall>3

==> reviews_folder/hotel_222.dat <==
<Overall>11
<Overall>5
<Overall>7

==> reviews_folder/hotel_333.dat <==
<Overall>7
<Overall>4
<Overall>10

awk -F'>' 'fn && FILENAME != fn{ 
              sub(".*/", "", fn);
              print fn, sprintf("%.2f", sum/n); sum = 0
          }
          { sum += $2; n = FNR; fn = FILENAME }
          END{ 
              sub(".*/", "", fn);
              print fn, sprintf("%.2f", sum/n)
          }' reviews_folder/hotel_*.dat

出力:

hotel_111.dat 2.67
hotel_222.dat 7.67
hotel_333.dat 7.00

おすすめ記事