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

为不同子目录下同名test.txt添加目录名列并合并文件

解决多目录下同名文件合并并添加目录名列的问题

嘿,我来帮你搞定这个需求!你要做的核心是给每个子目录里的test.txt文件加上所在目录名作为首列,然后把所有文件合并成一个,同时保证列头只出现一次对吧?之前用awk没成功,大概率是没处理好列头的重复问题或者目录名的提取逻辑,下面给你一个直接能用的解决方案:

核心命令

find mainfolder -name "test.txt" | awk '
    BEGIN { first_file = 1 }
    # 处理每个文件的第一行(列头)
    FNR == 1 {
        if (first_file) {
            # 第一个文件输出修改后的列头:首列加#Samplename
            print "#Samplename\t" $0
            first_file = 0
        }
        # 跳过其他文件的列头,避免重复
        next
    }
    # 处理数据行
    {
        # 提取当前文件所在的目录名(比如Folder1、Folder2)
        dir_path = FILENAME
        sub(/\/test.txt$/, "", dir_path)  # 去掉末尾的/test.txt
        sub(/.*\//, "", dir_path)         # 去掉前面的所有目录路径,只留最后一级目录名
        # 输出目录名 + 原行内容,用制表符分隔
        print dir_path "\t" $0
    }
' > merged_result.txt

命令详解

咱们拆解一下这个命令的关键部分:

  • find mainfolder -name "test.txt":自动遍历mainfolder下所有子目录,找到所有名为test.txt的文件。
  • BEGIN { first_file = 1 }:初始化一个标记,用来判断是否是第一个被处理的文件(控制列头只输出一次)。
  • FNR == 1:针对每个文件的第一行(也就是列头):
    • 如果是第一个文件,输出新增了#Samplename首列的列头,然后把标记设为0,后面的文件就不再输出列头了。
    • 用next跳过后续处理,避免把列头当成数据行处理。
  • 目录名提取:通过字符串替换操作,从当前文件名FILENAME中提取出存储文件的最后一级目录名(比如mainfolder/Folder1/test.txt会被处理成Folder1)。
  • 输出结果:把目录名和原行内容用制表符拼接后输出,最后重定向到merged_result.txt文件中。

简化版(依赖GNU awk)

如果你用的是GNU awk(大部分Linux系统默认是这个),可以用basename和dirname函数简化目录名提取的逻辑,代码更简洁:

find mainfolder -name "test.txt" | gawk '
    BEGIN { first_file = 1 }
    FNR == 1 {
        if (first_file) {
            print "#Samplename\t" $0
            first_file = 0
        }
        next
    }
    {
        dir_name = basename(dirname(FILENAME))
        print dir_name "\t" $0
    }
' > merged_result.txt

效果验证

假设你的Folder1/test.txt内容是:

#Name	Count	FragCount	Type	Left	LeftB	Right	RightB	Support	FRPM	LeftBD	LeftBE	RightBD	RightBE	annots
RFP1A	13	10	REF	RFP1A_ins	chr3:3124352:+	RFP1A_ins	chr3:5234143:+	confirmed	0.86	TA	1.454	AC	1.564	["INTRACHROM."]

Folder2/test.txt内容是:

#Name	Count	FragCount	Type	Left	LeftB	Right	RightB	Support	FRPM	LeftBD	LeftBE	RightBD	RightBE	annots
RFP2B	20	15	ALT	RFP2B_del	chr5:1234567:-	RFP2B_del	chr5:7654321:-	confirmed	0.92	GC	2.101	AT	1.890	["INTERCHROM."]

运行命令后,merged_result.txt的内容会是:

#Samplename	#Name	Count	FragCount	Type	Left	LeftB	Right	RightB	Support	FRPM	LeftBD	LeftBE	RightBD	RightBE	annots
Folder1	RFP1A	13	10	REF	RFP1A_ins	chr3:3124352:+	RFP1A_ins	chr3:5234143:+	confirmed	0.86	TA	1.454	AC	1.564	["INTRACHROM."]
Folder2	RFP2B	20	15	ALT	RFP2B_del	chr5:1234567:-	RFP2B_del	chr5:7654321:-	confirmed	0.92	GC	2.101	AT	1.890	["INTERCHROM."]

完全符合你想要的格式!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:14