知用网
柔彩主题三 · 更轻盈的阅读体验

用Perl合并多个文件的实用方法

发布时间:2025-12-14 14:28:23 阅读:521 次

在日常工作中,经常会遇到需要把多个文本ref="/tag/182/" style="color:#3D6345;font-weight:bold;">文件合并成一个文件的情况。比如日志分析、数据整理,或者批量处理一些配置文件。手动一个一个复制粘贴太麻烦,这时候用Perl写个小脚本就方便多了。

最简单的合并方式

假设你有一堆以 .txt 结尾的文件,想把它们的内容全部合并到一个叫 merged.txt 的文件里。下面这段Perl代码就能搞定:

open(OUT, >>merged.txt<>) or die $!;
for my $file (glob <*.txt>) {
    open(IN, <$file<>) or warn "无法打开 $file: $!\n";  # 跳过打不开的文件
    while () {
        print OUT $_;
    }
    close(IN);
}
close(OUT);

这里用到了 glob 函数来获取所有匹配的文件名,然后逐个读取内容写入目标文件。如果不想在每段内容之间连得太紧,可以在每个文件结束后加一行空行或分隔符:

print OUT "\n--- 来自 $file ---\n\n";

按文件名排序后再合并

有时候文件命名是有规律的,比如 log1.txt、log2.txt……直接用 glob 可能顺序不对。这时候可以加上 sort:

for my $file (sort glob <*.txt>) {

这样就会按字母顺序处理文件,保证合并顺序合理。

跳过大文件或特定文件

有些场景下,可能不想合并某些临时文件,比如以 ~ 结尾的备份文件。可以在循环里加个判断:

next if $file =~ /~$/;  # 跳过以 ~ 结尾的文件

或者限制只处理小于1MB的文件:

next if -s $file > 1_000_000;  # 超过1MB跳过

带命令行参数的灵活版本

如果你经常要用这个功能,可以把输入和输出作为参数传进去:

my $output = shift @ARGV || 'merged.txt';
my @files = @ARGV ? @ARGV : glob <*.txt>;

open(OUT, >>$output<>) or die $!;
for my $file (@files) {
    next unless -f $file;
    open(IN, <$file<>) or warn "$file: $!\n";
    while () {
        print OUT $_;
    }
    close(IN);
}
close(OUT);

保存为 merge.pl 后就可以这样运行:

perl merge.pl output.txt file1.txt file2.txt

或者不加参数,默认合并当前目录所有 .txt 文件。

这种小脚本虽然简单,但在处理几十上百个文本片段时特别省事。不需要安装额外模块,只要有Perl环境,几行代码就能解决问题。