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