perl - 如何比较两个文件之间的值?

标签 perl sorting awk sed sdiff

我有两个文件,其中两列以空格分隔

cat file1.txt
281475225437349 33,32,21,17,20,22,18,30,19,16,23,31
281475550885480 35,32,33,21,39,40,57,36,41,17,20,38,34,37,16,99

cat file2.txt
281475550885480 16,17,20,21,32,33,34,35,36,37,38,39,40,41
281475225437349 16,17,18,19,20,21,22,23,24,25,30,31,32,33

我想将文件 1 列 2 中的值与文件 2 列 2 中的值进行比较,以了解列 1 中的相同值。 并仅打印文件 1 列 2 中存在但不存在于文件 2 列 2 中的值,反之亦然,以及列 1 中的相应值

期望的o/p

它不应打印 281475225437349 的任何内容,因为 file1 列 2 中的所有值都存在于 281475225437349 的文件 2 列 2 中

它应该只打印 281475550885480 的值,该值存在于 file1 column2 中,但不存在于 file2 column2 中。例如 281475550885480 的值 57 和 99

所以 o/p 文件如下:

cat output.txt
281475550885480 57,99

我尝试过对文件进行排序并使用 sdiff 进行比较,但它给出了差异并且需要时间

sdiff file1.txt file2.txt

最佳答案

Perl 解决方案:从第二个文件创建哈希值的哈希值。键是大数字,内部键是逗号分隔列表中的较小数字。然后迭代第一个文件并检查记住的结构中未提及哪些数字。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

open my $f1, '<', 'file1' or die $!;
open my $f2, '<', 'file2' or die $!;

my %seen;
while (<$f2>) {
    my ($key, $value_string) = split ' ';
    my @values = split /,/, $value_string;  #/
    undef @{ $seen{$key} }{@values};
}
while (<$f1>) {
    my ($key, $value_string) = split ' ';
    my @values = split /,/, $value_string;
    my %surplus;
    undef @surplus{@values};
    delete @surplus{ keys %{ $seen{$key} } };
    say $key, ' ', join ',', keys %surplus
        if keys %surplus;
}

顺便说一句,当你切换文件时,输出将是

281475225437349 24,25

因为 file1 中不存在 24 和 25。

关于perl - 如何比较两个文件之间的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54364389/

相关文章:

Perl CGI 可靠地读取 url_param 和 param

perl - 使用 CPAN 将 Perl 模块安装到特定目录,当几个模块出现在使用中时

javascript - 带有 getElementsByTagName 的嵌套标签名称不起作用

c++ - 为什么当我输入 12 位数字时,以下代码会崩溃?

linux - 使用 awk 的 ~ 运算符

perl - %hash和\%hash作为参数之间的区别?

regex - 如何打印 Perl 字符类?

mysql - 使用 Rails 上的 created_at 数据对数组进行排序(使用 sort_by { |x| x.created_at } 它只是保持相同的方式

linux - 使用 sed 或 awk 等脚本清理 Linux 中的文件

regex - 通过 awk 检索日志模式