如何合并不同子文件夹的文件并添加文件名作为首列(处理重复表头)
解决多文件夹TXT文件合并并添加文件名列的问题
原脚本的问题
- 循环内未使用遍历到的
$filename变量,反而每次处理当前目录下的*.txt,完全没用到子文件夹的目标文件 - 每次使用
> CombinedFile.txt会覆盖之前的文件内容,最终仅保留最后一次循环的处理结果 - 未处理重复表头,每个文件的表头都会被输出,导致结果冗余
正确的解决方案
直接用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
相关产品推荐
相关产品推荐

