shell脚本中的文件操作

shell脚本中的文件操作

我需要提取以唯一模式开头的行数,并按以下格式打印模式和出现次数。模式分隔符应为 /。

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

相关内容