比较两个文件

比较两个文件

我在 UNIX 中有两个文件。第一个文件是实体,第二个文件是引用。第一个文件只有一列名为实体 ID,第二个文件有两列实体 ID |人员 ID。

我想生成一个输出文件,其中两个文件中的实体 ID 都匹配。

实体文件

624197
624252
624264
624276
624280
624309
624317

参考文件

624252|624346
624264|1070122
624264|624346
624276|624588
624280|624346
624280|624582
624298|624588
624319|333008
624330|624588

输出文件

624252|624346
624264|1070122
624264|624346
624276|624588
624280|624346
624280|624582

实体文件有 90K 记录,参考文件有 200K 记录。有没有有效的方法来生成第三个文件?任何解决方案表示赞赏。

答案1

假设您的文件都已排序:

join -j1 -t\| entity.txt reference.txt

如果未排序,请对它们进行排序:

sort entity.txt -o entity-sorted.txt
sort reference.txt -o reference-sorted.txt
join -j1 -t\| entity-sorted.txt reference-sorted.txt

答案2

您可以使用 bash / zsh 单行代码来做到这一点。假设您的数据包含在名为entity和 的文件中reference,只需键入:

for i in $(cat entity); do grep ^$i reference; done

在控制台中。

此外,您可以将整个输出重定向到一个 output文件,如下所示

for i in $(cat entity); do grep ^$i reference; done > output

答案3

解决方案使用珀尔:

内容实体.txt:

$ cat entity.txt
624197
624252
624264
624276
624280
624309
624317

内容参考文献.txt:

$ cat reference.txt 
624252|624346
624264|1070122
624264|624346
624276|624588
624280|624346
624280|624582
624298|624588
624319|333008
624330|624588

Perl脚本的内容:

$ cat script.pl
use warnings;
use strict;

## Check arguments.
@ARGV == 2 or die qq[Usage: perl $0 <entity-file> <reference-file>\n];

## File in process.
my $process_file = 1;

## Hash to save entities.
my %entity;


while ( <> ) {
        ## Process file of entities. Remove leading and trailing spaces, and save the
        ## number to a hash.
        if ( $process_file == 1 ) {
                s/\A\s*//;
                s/\s*\z//;
                if ( defined $_ ) { $entity{ $_ } = 1 }
                next;
        }

        ## Process file of references. Get first field and search it in the hash.
        ## If found, print the line.
        my @f = split /\|/, $_, 2;
        if ( exists $entity{ $f[0] } ) {
                print;
        }

} continue {
        ## Increment number when end processing first file.
        if ( eof ) { ++$process_file }
}

不带参数运行脚本:

$ perl script.pl
Usage: perl script.pl <entity-file> <reference-file>

使用参数和结果运行脚本:

$ perl script.pl entity.txt reference.txt 
624252|624346
624264|1070122
624264|624346
624276|624588
624280|624346
624280|624582

答案4

嗯,也许我错过了什么?如果我错了,请纠正我:

$ while read id;do grep $id reference ;done <identity 
624252|624346
624264|1070122
624264|624346
624276|624588
624280|624346
624280|624582

查看您的源文件,它们已经排序,但我相信无论它们是否排序,我的解决方案都应该有效。

并输出到另一个文件:

$ while read id;do grep $id reference ;done < identity > newoutput.out

相关内容