如何用Bash批量为数百个文件末尾添加存储文件名的新列
可行实现方案
你原有的脚本存在两个待优化点:一是没有实现原地修改原文件,二是表头行末尾会被插入文件名而非要求的name列名,以下是两种可直接使用的修正实现:
方案1:GNU Awk 原地修改(推荐,Linux环境默认支持)
GNU Awk 4.1.0及以上版本支持内置的原地修改参数,执行效率最高:
for file in *.txt; do awk -i inplace 'BEGIN{OFS="\t"} NR==1{print $0, "name"} NR>1{print $0, FILENAME}' "$file" done
参数说明:
-i inplace:开启原地修改功能,直接覆盖原文件NR==1判断当前为表头行,末尾追加name列名,其余行追加当前文件名- 变量外层添加双引号,避免文件名含空格时执行异常
方案2:全平台兼容的临时文件中转方案
如果是macOS等没有自带GNU Awk的环境,用临时文件中转的方式兼容性最好:
for file in *.txt; do awk 'BEGIN{OFS="\t"} NR==1{print $0, "name"} NR>1{print $0, FILENAME}' "$file" > "$file.tmp" && mv "$file.tmp" "$file" done
注意事项
- 批量执行前建议先拿单个测试文件验证输出格式符合预期,避免原文件被误改
- 单文件1000万行的场景下,两种方案的处理效率都足够,Awk本身为大文本处理做了专项优化,不会有明显性能瓶颈
- 如果需要保留原文件备份,可以把方案2的
mv命令改成cp "$file" "$file.bak" && mv "$file.tmp" "$file",自动给每个原文件生成带.bak后缀的备份
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

