【问题标题】:Combine two tab-separated text files合并两个制表符分隔的文本文件
【发布时间】:2018-09-16 09:39:02
【问题描述】:

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

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 可能位于 output 中的 column1

我试图从How to compare and merge multiple files? 那里找到答案 我不知道为什么foreach my $key (keys %ref){ push( @{$ref{$key} }, $current{key}} 这条线不能正常工作。

【问题讨论】:

  • 请出示您需要我们帮助您处理的代码:我们什么也做不了。数据文件中真的有空行吗?真的有列标题Col1Col2 等吗?
  • 一种方法:使用DBD::CSV 将文件视为数据库中的表,并使用适当的SQL 语句将它们连接起来。
  • @Shawn:所以用那个模块写一个答案。
  • @Borodin:是的,数据中有空行,所有数据集都有标题。

标签: perl


【解决方案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 是我的即使没有实际的数据库,也可以采用通常的处理方式。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多