如何在 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(计算标点符号)。

相关内容