【问题标题】:Search for pattern and print sub-directory and the total count side by side并排搜索图案和打印子目录和总数
【发布时间】:2026-01-14 05:20:09
【问题描述】:

我有一个名为 out 的目录,在该目录中我有 20 个子目录,每个子目录的名称都以 _f 结尾,并且有一个名为 report.txt 的文件。 以下是一个子目录的 report.txt,子目录名称为 first

Column1     Column2     Column3     Column4     Column5
spent       23          32          23          32
Done        76          87          98          76
Listed      87          78          56          98
Total       186         197         177         206

我们不需要总结任何东西,总数将已经打印在 report.txt 文件中,我需要为一个子目录打印如下输出(first) 如下。

输出语法:

Sub-directory name:  Count(Column 4)

输出:

First: 177

我尝试了这段代码,但没有得到确切的解决方案:

#!/bin/bash
echo "Thesereports are based on this directory:" ; pwd
echo " " ;
File="report.txt"
for d in *_f;
do
echo "$d:";
awk '/Total/{print "Total no of warnings:" $(NF-1);exit}' "$d"/"$File"
done

【问题讨论】:

  • "每个子目录名都以_f结尾"和"子目录名first"不一致.你的意思是“子目录名是第一个**_f**”还是别的什么?

标签: bash awk while-loop


【解决方案1】:

您可以通过以下方式在单个 awk 命令中完成此操作:

awk '/^Total/{f=FILENAME; sub(/_.*/, "", f); print f ":\t" $4}' *_f/report.txt
first:  177
second: 142

【讨论】:

    【解决方案2】:

    你可以使用这个循环。

    for f in *_f/report.txt; do
        cnt=$( awk '/^Total/{print $4}' "$f" )
        printf "%s:\t%s\n" "${f%_*}" "$cnt"
    done
    

    我假设子目录被命名为first_fsecond_f 等,所以我们打印如下行:

    first:   177
    second:   42
    

    您可以在 printf 周围添加任何其他文本。

    【讨论】:

    • @thanasip 你能解释一下 printf 行吗...?
    • 我还添加了printf 的链接以查看更多详细信息。第一个参数是要打印的字符串,其中存在空格符,例如%s 表示“在那里等待字符串”。其余参数是printf 将用来替换这些空间持有者的变量。
    • 要打印的第一个变量是变量$f{%_*},这意味着将子字符串从最后一个_ 剪切到末尾并保留该字符串的第一部分。第二个参数是awk 命令的输出,在上一行计算。
    • @thanasip 如果我们不想从最后一个 _ 中剪切子字符串,那么我们可以这样使用:printf "%s:\t%s\n" "${f }" "$cnt"
    • 是的,没错。这也包括reports.txt。如果你只想要子目录,它是${f%/*},更多关于参数扩展,wiki.bash-hackers.org/syntax/pe