如何基于文件名向指定TXT文件添加列并修改原文件?
解决方案
这里有个精准匹配你需求的实现方案,结合你已有的查找逻辑,我们可以用find+awk组合来完成批量修改文件的操作,完美实现给每个目标文件添加name_file列的需求:
完整命令代码
SourceFile='/root/Document/Source/' # 修正find路径并匹配目标文件,确保只处理符合规则的txt文件 find "$SourceFile" -type f -regextype posix-regex -iregex "^.*/ABCDEF_555_[0-9]{5}\.txt$" | while read -r target_file; do # 用awk处理文件内容,先写入临时文件再替换原文件,避免直接覆盖出错 awk -v file_name="$(basename "$target_file")" ' BEGIN {FS=OFS="|"} # 设置输入输出分隔符为| NR == 1 {print $0, "name_file"} # 表头行追加字段名 NR > 1 {print $0, file_name} # 数据行追加当前文件名 ' "$target_file" > "$target_file.tmp" && mv "$target_file.tmp" "$target_file" done
关键细节说明
- 修正了你原
find命令里的小问题:去掉了$SourceFile后面多余的.,同时加上-type f确保只处理文件(不会误匹配目录),用双引号包围变量避免路径含空格时出错 - 使用
basename "$target_file"提取纯文件名(不带路径),这样追加的就是你要的ABCDEF_555_12345.txt这类格式 - 用临时文件
$target_file.tmp过渡,只有当awk处理成功时才替换原文件,防止中途出错导致原文件损坏 FS=OFS="|"保证awk处理时保持原文件的|分隔符格式,不会出现乱码或分隔错误
之前你用awk没得到理想结果,大概率是没正确传递文件名变量,或者没区分表头行和数据行的逻辑,这个方案刚好补上了这些点。
内容的提问来源于stack exchange,提问作者Tsabit Abdullah
相关产品推荐
相关产品推荐

