空白を計算せずに各レコードのフィールドの平均長を知らせるスクリプトをawkにどのように書くことができますか?

空白を計算せずに各レコードのフィールドの平均長を知らせるスクリプトをawkにどのように書くことができますか?

したがって、テキスト文書内の各レコードの平均フィールド長を見つけて印刷するには、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(句読点の計算)です。

関連情報