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