2つのファイルの比較

2つのファイルの比較

UNIXには2つのファイルがあります。最初のファイルはエンティティで、2番目のファイルは参照です。最初のファイルには Entity ID という列が 1 つだけあり、2 番目のファイルには Entity ID Person ID という 2 つの列があります。

両方のファイルのエンティティ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

エンティティファイルには90,000のレコードがあり、参照ファイルには200,000のレコードがあります。 3番目のファイルを生成する効率的な方法はありますか?すべてのソリューションに感謝します。

答え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シングルライナーを使用してこれを行うことができます。データがentityandというファイルに含まれているとし、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

関連情報