合并两个制表符分隔的文本文件

时间:2018-09-16 09:39:02

标签: perl

我有两个用制表符分隔的标题文本文件。

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}} 行不能正常工作。

1 个答案:

答案 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。即使没有实际的数据库,通常的处理方式。