我需要提取以唯一模式开头的行数,并按以下格式打印模式和出现次数。模式分隔符应为 /。
file.txt 包含以下条目
path1/path1/Dockerfile
path1/path1/path1.config
path2/inputdir/Dockerfile
path2/inputdir/path1.config
path2/outputdir/path1.config
pipelines/pipeline1.yml
pipelines/jobs/job1.yml
输出应如下所示
path1=2
path2=3
pipelines=2
我使用 awk 如下,但它需要模式匹配作为输入(如 path1,而这需要动态驱动。
awk '/^path1/{a++}END{print a}' files.txt
有人可以对此提出建议吗?谢谢。
答案1
您想要跟踪每个顶级目录名称的一个计数。这是最简单的方法,使用关联数组并awk
以目录名称为键。然后,我们可以将每一行读取为一组/
- 分隔字段,以便轻松访问目录名称(第一个字段):
awk -F / '{ count[$1]++ } END { for (name in count) printf "%s=%s\n", name, count[name] }' file
使用多行布局的代码:
awk -F / '
{ count[$1]++ }
END {
for (name in count)
printf "%s=%s\n", name, count[name]
}' file
这是令人怀念的您自己的代码,但不会尝试匹配每行开头的特定字符串。相反,考虑到字段是由/
(我们在命令行上排列的-F /
)分隔的,我们选择第一个带有 的字段$1
。
然后,第一个字段的值将用作名为 的数组中的键count
。虽然您使用标量变量 ,a
但 中 的数组awk
可用于一次跟踪许多不同的值,我们只需增加与第一个字段关联的值。
最后,我们循环遍历count
数组中所有收集到的键,并将它们以及与每个键关联的值一起打印出来。
请注意,输出是无序的,并且根据awk
您所使用的内容,每次运行命令时可能会以不同的顺序显示。
如果输出格式不太重要,那么您还可以通过使用 剪切第一个字段cut
,对其进行排序(如果数据尚未排序),然后计算唯一字符串来解决此问题:
$ cut -d / -f 1 file | sort | uniq -c
2 path1
3 path2
2 pipelines