我有两个用制表符分隔的标题文本文件。
File1有11列
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 Col10 Col1
1 NH1 NH1 Unknown 149578 B2 202410200023_R02C02
2 NH2 NH2 Unknown 149578 A4 202410200023_R04C01
10 NH10 NH10 Unknown 149578 A1 202410200023_R01C01
11 BU51 BU51 Unknown 149578 B3 202410200023_R03C02
12 BU52 BU52 Unknown 149578 A6 202410200023_R06C01
file2具有4、5或更多列。
Col1 Col2 Col3 Col4 Col5
BU51 149578 BU51 Unknown 1
BU52 149578 BU52 Unknown 1
NH1 149578 NH1 Unknown 1
NH2 149578 NH2 Unknown 1
我尝试使用文件1的第2到4列以及文件2的第4和5列进行输出。但是file1中的col2或col3需要与file2中的col1或col2匹配。输出列可能具有新位置。例如file1的column2可能位于输出
的column1处我尝试从How to compare and merge multiple files?
找到答案
我不确定为什么foreach my $key (keys %ref){ push( @{$ref{$key} }, $current{key}}
行不能正常工作。
答案 0 :(得分:1)
您的加入条件有点混乱file2.col2与file1.col2或file1.col3没有什么共同点...您是说file2.col3吗?而且您没有任何示例输出,因此我们确切地知道您要查找的内容。
但是我认为这会起作用。它依靠前面提到的DBD::CSV模块来读取tsv文件并加入它们,以及DBIx::TSV来格式化输出。两者都可以通过您最喜欢的CPAN客户端获得。
#!/usr/bin/perl
use warnings;
use strict;
use DBI;
use DBIx::TSV;
my $dbh = DBI->connect("dbi:CSV:", undef, undef,
{csv_tables => {
"file1" => { f_file => "file1.tsv" },
"file2" => { f_file => "file2.tsv" }
},
csv_sep_char => "\t"
}) or die $DBI::errstr;
print $dbh->selectall_tsv(<<EOQ);
SELECT f1.col2 AS Col1, f1.col3 AS Col2, f1.col4 AS Col3, f2.col4 AS Col4, f2.col5 AS Col5
FROM file1 AS f1
, file2 AS f2
WHERE f1.col2 = f2.col1 OR f1.col2 = f2.col3 OR f1.col3 = f2.col1 OR f1.col3 = f2.col3
EOQ
$dbh->disconnect;
打印出来的
Col1 Col2 Col3 Col4 Col5
NH1 NH1 Unknown Unknown 1
NH2 NH2 Unknown Unknown 1
BU51 BU51 Unknown Unknown 1
BU52 BU52 Unknown Unknown 1
(SO格式在选项卡上无法正常播放)
我敢肯定,还有其他方法可以做到,但是当您开始谈论基于公共字段连接不同文件的行,然后仅显示某些字段时……我只是大叫关系数据和SQL。即使没有实际的数据库,通常的处理方式。