我在 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