gpt4 book ai didi

linux - 根据第二个文件中对应的 ID 列表从文件中提取第一个条目?

转载 作者:太空宇宙 更新时间:2023-11-04 06:05:37 25 4
gpt4 key购买 nike

我有一个 2 文本文件。 file1 包含 ID:

0   ABCD  
3 ABDF
4 ACGFR
6 ABCD
7 GFHTRSFS

文件2:

ID001  AB  ACGFR  DF  FD  GF  TYFJ  ANH  
ID002 DFR AG ABDF HGT MNJ POI YUI
ID003 DGT JHY ABCD YTRE NHYT PPOOI IUYNB
ID004 GFHTRSFS MJU UHY IUJ POL KUH KOOL

如果文件 1 的第二列与文件 2 中的任何条目匹配,则文件 2 的第一列应该是它的答案。

输出应该是这样的:

0   ID003
3 ID002
4 ID001
6 ID003
7 ID004

(文件 1 (ABCD) 的第二列与文件 2 的第三行(ID003)匹配。因此,ID003 应该是它的答案)。

我也尝试过其他帖子中的示例,但不知何故它们与此不匹配。

任何帮助将不胜感激。

亲切的问候

最佳答案

当尝试将一个文件中的记录与另一个文件中的记录进行匹配时,其想法是使用哈希(也称为关联数组、键值对集或字典)来存储第一列和其余列之间的关系。实际上,创建以下关系:

file1: ABCD     -> 0
ABDF -> 3
ACGFR -> 4
FGHTRSS -> 6
GFHTRSFS -> 7

file2: AB -> ID001
ACGFR -> ID001
DF -> ID001
...
ANH -> ID001
DFR -> ID002
AG -> ID002
...
KUH -> ID004
KOOL -> ID004

文件之间记录的实际匹配相当于确定如果两个散列,则此处 file1 和 file2 都为每个 file1 记录定义了键。在这里我们可以看到 ACGFR 是两者的键,因此我们可以匹配 4ID001,对于其余键,依此类推。

在 Perl 中,我们可以通过分配值对来创建哈希:

my %hash = ( foo => 1, bar => 2 );

也可以使用引用创建哈希:

my $hash_ref = { foo => 1, bar => 2 };

可以使用keys函数找到键,并且可以提取单个值:

my $val1 = $hash{ foo };       # regular hash
my $val2 = $hash_ref->{ foo }; # hash reference

可以使用 exists 函数测试特定键是否是哈希的成员。

排除了这个背景,下面是在 Perl 中执行此操作的一种方法:

ma​​tchup_files.pl

#!/usr/bin/env perl

use warnings;
use strict;

my $usage = "usage: $0 file1 file2\n";

my ($file1, $file2) = @ARGV;
for my $file ($file1, $file2) {
die $usage unless defined $file && -f $file; # -f checks whether $file is an actual file
}

# Create mappings col2 -> col1
# col3 -> col1
# col4 -> col1
my $h1 = inverted_hash_file_on_first_column( $file1 );
my $h2 = hash_file_on_first_column( $file2 );

# Try to find matching pairs
my $matches = {};
for my $h1_key ( keys %$h1 ) {
my $h1_val = $h1->{$h1_key};
if ( exists $h2->{ $h1_val } ) {
# We have a match!
my $num = $h1_key;
my $id = $h2->{ $h1_val };
$matches->{ $num } = $id;
}
}

# Print them out in numerical order
for my $num ( sort { $a <=> $b } keys %$matches ) {
my $id = $matches->{$num};
print join(" ", $num, $id) . "\n";
}

exit 0; # Success

sub inverted_hash_file_on_first_column {
my ($file) = @_;
return _hash_file($file, 1);
}

sub hash_file_on_first_column {
my ($file) = @_;
return _hash_file($file, 0);
}

sub _hash_file {
my ($file, $inverted) = @_;

my $fhash = {};
open my $fh, "<", $file or die "Unable to open $file : $!";
while ( my $line = <$fh> ) {
my @fields = split /\s+/, $line; # Split line on whitespace
my $key = shift @fields; # First column
for my $field ( @fields ) {
if ( $inverted ) {
die "Duplicated field '$field'" if exists $fhash->{ $key };
$fhash->{ $key } = $field;
} else {
die "Duplicated field '$field'" if exists $fhash->{ $field };
$fhash->{ $field } = $key;
}
}
}
return $fhash;
}

输出

matchup_files.pl input1 input2
0 ID003
3 ID002
4 ID001
6 ID003
7 ID004

关于linux - 根据第二个文件中对应的 ID 列表从文件中提取第一个条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com