bash - 逐行比较 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.txt、file3.txt和file4.txt与file1.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)。
如果外壳更容易,那也没关系。
解决方案
一种按行并行处理文件的方法
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 行有所不同
推荐阅读
- sql-server - sql中的除法和乘法精度
- list - Prolog 子列表关系
- html - Firefox 中的填充和内容之间的空间
- wpf - Windows XP 上 WPF 中的 SaveFileDialog 显示空文件列表
- oracle - 无法在 DECS 活动创建中映射字段
- c - 具有本机元编程的自定义 IDispatch 是否可能?
- docker - 创建新的 docker 镜像与运行 shell 命令
- python - 了解 Django Auth 应用程序如何创建其表
- pandas - 熊猫没有始终如一地跳过skirows参数的输入行数?
- node.js - 使用socket io实时获取数据不起作用