You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并不同子文件夹的文件并添加文件名作为首列(处理重复表头)

解决多文件夹TXT文件合并并添加文件名列的问题

原脚本的问题

  1. 循环内未使用遍历到的$filename变量,反而每次处理当前目录下的*.txt,完全没用到子文件夹的目标文件
  2. 每次使用> CombinedFile.txt会覆盖之前的文件内容,最终仅保留最后一次循环的处理结果
  3. 未处理重复表头,每个文件的表头都会被输出,导致结果冗余

正确的解决方案

直接用awk一次性处理所有目标文件,高效实现需求:

shopt -s globstar
awk '
    # 处理每个文件的第一行(表头)
    FNR == 1 {
        # 仅保留第一个文件的表头,并添加"文件名"作为第一列标题
        if (NR == 1) print "文件名\t" $0
        # 跳过其他文件的表头
        next
    }
    # 处理非表头行,添加文件名前缀
    {print FILENAME "\t" $0}
' path/**/*.txt > CombinedFile.txt

脚本逻辑说明

  • shopt -s globstar:开启shell的递归匹配模式,让path/**/*.txt能匹配path下所有子文件夹中的TXT文件
  • FNR == 1:匹配当前处理文件的第一行(即表头行)
    • NR == 1:判断是否是整个处理流程的第一行(也就是第一个文件的表头),此时输出带"文件名"列的表头
    • next:跳过其他文件的表头,避免重复输出
  • 非表头行直接输出文件名 + 制表符 + 行内容

可选:获取绝对路径的文件名

如果需要在结果中显示文件的绝对路径,可改用find配合xargs处理:

find path -name "*.txt" -type f -print0 | xargs -0 awk '
    FNR == 1 {
        if (NR == 1) print "文件名\t" $0
        next
    }
    {print FILENAME "\t" $0}
' > CombinedFile.txt

内容的提问来源于stack exchange,提问作者vanish007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:40:37