使用 awk 脚本,如何计算文件中子字符串所在字段的数量?

使用 awk 脚本,如何计算文件中子字符串所在字段的数量?

例如,我有文本文档:

"Hello, I am the janitor and I have a headache
 The rabbit jumped over the red brick wall"

我想计算子字符串“he”出现的字段数。我不想计算文件中“他”的数量,只想计算字段的数量。

因此,对于我的示例,它应该打印出如下内容:

Number of fields that contain 'he' in record #1: 3
Number of fields that contain 'he' in record #2: 2

它必须是 awk 脚本。

答案1

这些字段从 开始编号1,并NF包含字段的数量。因此,我们可以使用 来迭代它们for (i = 1; i <= NF; i++) { ... },并$i在循环内引用相关字段。 (i实际上只是字段的编号,我们需要$运算符来获取字段的实际内容。)

至于查找一个值是否包含特定子字符串,使用正则表达式是最简单的。s ~ /foo/将查看该变量是否与任何位置的s字符串匹配foo,即它是否包含它作为子字符串。现在,您可能还想匹配一个大写字母,在这种情况下,eg[Ff]可以代替f.括号组[...]匹配其中的任意一个字符。

当然,您还需要一个计数器,但这很简单,只需在循环之前将变量初始化为零(例如count=0),如果存在匹配则递增(count += 1)。

~~

因此,基本上,为文件的每一行/记录运行一些代码的 awk 脚本只是

awk '{ some code }' < filename.txt

在代码块内部,for循环适合,并且它还需要一个大括号中的块{ .. }

awk '{ for ( ... ) { some code } }`

和一个if类似的作品,

if (condition) { some code... }

(它们实际上看起来就像C 语言中的forand一样if。)

并且可以使用分号来分隔语句,所以

awk '{ what to do before the loop; for ( ... ) { some code }; what to do after }`

答案2

通过下面的 awk 脚本完成

awk -v i="he" '{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}' file

输出

Number of fields that contain he 3 in record 1
Number of fields that contain he 2 in record 2

相关内容