为不同子目录下同名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
相关产品推荐
相关产品推荐

