![如何在 awk 中编写脚本来告诉每个记录中字段的平均长度,而不计算空格?](https://linux22.com/image/163454/%E5%A6%82%E4%BD%95%E5%9C%A8%20awk%20%E4%B8%AD%E7%BC%96%E5%86%99%E8%84%9A%E6%9C%AC%E6%9D%A5%E5%91%8A%E8%AF%89%E6%AF%8F%E4%B8%AA%E8%AE%B0%E5%BD%95%E4%B8%AD%E5%AD%97%E6%AE%B5%E7%9A%84%E5%B9%B3%E5%9D%87%E9%95%BF%E5%BA%A6%EF%BC%8C%E8%80%8C%E4%B8%8D%E8%AE%A1%E7%AE%97%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
所以我需要编写一个 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(计算标点符号)。