したがって、テキスト文書内の各レコードの平均フィールド長を見つけて印刷するには、awkスクリプトファイルを作成する必要があります。テキスト文書は次のとおりです。
The quick brown fox jumped over the lazy dog's back.
The rain in Spain falls mainly on the plain.
The rain in Spain also falls on the mountains.
今私がスクリプトファイルで使用しているのは次のとおりです。
{average = length($0)/NF
print "Average field length for record: " average}
"length($0)" を実行すると、レコードのすべての内容が計算されます。 length($1)+length($2)+length($3)+etc と同じ操作を試しましたが、レコードの長さが異なるため説明できません。特に、これはすべての長さのレコードで機能する必要があるためです。
私が経験している問題は、各フィールド間のスペースを計算しますが、計算したくないということです。現在、各レコードについて私が得た数字は5.2、4.8、5.1です。スペースを数えない方法はありますか?
これに加えて、ファイル全体の平均フィールド長も見つける必要があります。繰り返しますが、私のawkスクリプトは私が望んでいない空白も計算すると思います。これは私のスクリプトファイルです。
BEGIN{
sum = 0
}
{
sum += length()
sum = sum/NF
}
END{
print "Average field length in file: " sum
}
スペースを計算せずに文字と句読点のみを計算し、デフォルトでスペース以外のすべてを計算するにはどうすればよいですか?実際、テキストファイルのすべてのフィールドで得られた平均は5.7ですが、これは間違っているようです。
答え1
デフォルトのフィールド区切り文字を使用し、フィールドサイズを計算してスペースをスキップし、変数を使用してさまざまなフィールド数を記述することで提案に従うことができますNF
。
したがって、各レコードの平均は次のようになります。
NF > 0 {
linesum = 0
for (i = 1; i <= NF; i++) linesum += length($i)
print "Average field length for record: " linesum / NF
}
フルファイルの場合:
{
for (i = 1; i <= NF; i++) sum += length($i)
count += NF
}
END { if (count > 0) { print "Average field length in file: " (sum / count) } }
これにより、行ごとに平均を計算する問題も解決します。
あなたの例によると、平均は4.17857(句読点の計算)です。