首页 > 解决方案 > 逐行比较 4 个文件,看它们是否匹配

问题描述

我正在尝试比较 4 个文本文件的每行计数:

file1.txt:
32
44
75
22
88

file2.txt
32
44
75
22
88

file3.txt
11
44
75
22
77

file4.txt
    32
    44
    75
    22
    88

每行代表一个标题

line1 = customerID count
line2 = employeeID count
line3 = active_users
line4 = inactive_users
line5 = deleted_users

我正在尝试将file2.txtfile3.txtfile4.txtfile1.txt进行比较;file1.txt将始终具有正确的计数。

示例:由于file2.txt与上面示例中的file1.txt完全匹配,因此我尝试输出“file2.txt 很好”,但由于file3.txt line1 和 line5 与file1.txt不匹配,所以我' m 试图输出“file3.txt 的客户 ID 与 21 条记录不匹配”,( 32 - 11 = 21)和“file3.txt 中的已删除用户与 11 条记录不匹配”,(88 - 77 = 11)。

如果外壳更容易,那也没关系。

标签: bashshellfileperl

解决方案


一种按行并行处理文件的方法

use warnings;
use strict;
use feature 'say';

my @files = @ARGV;
#my @files = map { $_ . '.txt' } qw(f1 f2 f3 f4);  # my test files' names

# Open all files, filehandles in @fhs
my @fhs = map { open my $fh, '<', $_  or die "Can't open $_: $!"; $fh } @files;

# For reporting, enumerate file names
my %files = map { $_ => $files[$_] } 0..$#files;

# Process (compare) the same line from all files       
my $line_cnt;
LINE: while ( my @line = map { my $line = <$_>; $line } @fhs )
{
    defined || last LINE for @line;
    ++$line_cnt;
    s/(?:^\s+|\s+$)//g for @line;
    for my $i (1..$#line) {
        if ($line[0] != $line[$i]) { 
            say "File $files[$i] differs at line $line_cnt"; 
        }
    }
}

这会比较整行==在去除前导和尾随空格之后),因为给定每行带有一个需要比较的单个数字。

它打印,我的测试文件名为f1.txt, f2.txt, ...

文件 f3.txt 在第 1 行有所不同
文件 f3.txt 在第 5 行有所不同

推荐阅读