UNIX에는 두 개의 파일이 있습니다. 첫 번째 파일은 엔터티이고 두 번째 파일은 참조입니다. 첫 번째 파일에는 Entity ID라는 열이 하나만 있고 두 번째 파일에는 Entity ID Person 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
엔터티 파일에는 90,000개의 레코드가 있고 참조 파일에는 200,000개의 레코드가 있습니다. 세 번째 파일을 생성하는 효율적인 방법이 있습니까? 모든 솔루션에 감사드립니다.
답변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