例如,我有文本文档:
"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 语言中的for
and一样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