Perl:匹配两个文件中的数据

Posted

技术标签:

【中文标题】Perl:匹配两个文件中的数据【英文标题】:Perl: matching data in two files 【发布时间】:2015-08-16 11:51:06 【问题描述】:

我想匹配并打印两个文件(File1.txt 和 File2.txt)中的数据。目前,我正在尝试将 File1 中第二列的第一个字母与 File2.txt 中第三列的第一个字母匹配。

File1.txt
1  H  35
1  C  22
1  H  20

File2.txt
A  1 HB2 MET  1 
A  2 CA  MET  1
A  3 HA  MET  1

OUTPUT
1  MET  HB2  35
1  MET  CA   22
1  MET  HA   20 

这是我的脚本,我已尝试按照此提交:In Perl, mapping between a reference file and a series of files

#!/usr/bin/perl

use strict;
use warnings;

my %data;

open (SHIFTS,"file1.txt") or die;
open (PDB, "file2.txt") or die;

while (my $line = <PDB>) 
    chomp $line;
    my @fields = split(/\t/,$line);
    $data$fields[4] = $fields[2];
 

 close PDB;

 while (my $line = <SHIFTS>) 
    chomp($line);
    my @columns = split(/\t/,$line);
    my $value = ($columns[1] =~ m/^.*?([A-Za-z])/ );
 
    print "$columns[0]\t$fields[3]\t$value\t$data$value\n";

 close SHIFTS;
 exit;

【问题讨论】:

有什么问题? 是的,您真正想问什么?请说明您面临的问题(至少)以及您尝试过的方法。 另外,您没有在任何地方匹配两个文件之间的列。你也应该调查一下。 @choroba,感谢您的 cmets,我已尝试上述脚本并收到错误“在连接或字符串中使用未初始化的值”,我认为这是因为我没有匹配适当的值.我想知道是否有人可以为我指明正确的方向,以及如何实现这一目标。 【参考方案1】:

这是使用 split() 黑客的一种方法:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $f1 = 'file1.txt';
my $f2 = 'file2.txt';

my @pdb;

open my $pdb_file, '<', $f2
  or die "Can't open the PDB file $f2: $!";

while (my $line = <$pdb_file>)
    chomp $line;
    push @pdb, $line; 


close $pdb_file;

open my $shifts_file, '<', $f1
  or die "Can't open the SHIFTS file $f1: $!";

while (my $line = <$shifts_file>)

    chomp $line;

    my $pdb_line = shift @pdb;

    # - inner split: get the third element from the $pdb_line
    # - outer split: get the first element (character) from the
    #   result of the inner split

    my $criteria = (split('', (split('\s+', $pdb_line))[2]))[0];

    # - compare the 2nd element of the file1.txt line against
    #   the above split() operations

    if ((split('\s+', $line))[1] eq $criteria)
        print "$pdb_line\n";
    
    else 
        print "**** >$pdb_line< doesn't match >$line<\n";
    

文件:

file1.txt(注意我更改了第二行以确保不匹配有效):

1  H  35
1  A  22
1  H  20

file2.txt:

A  1 HB2 MET  1 
A  2 CA  MET  1
A  3 HA  MET  1

输出:

./app.pl
A  1 HB2 MET  1 
****>A  2 CA  MET  1< doesn't match >1  A  22<
A  3 HA  MET  1

【讨论】:

感谢您的脚本,我可以看到如何使用 if 语句来匹配两个文件中的值。

以上是关于Perl:匹配两个文件中的数据的主要内容,如果未能解决你的问题,请参考以下文章

Perl:匹配文件中的正则表达式

sed 或 Perl 一行 + 如何仅在完全匹配时替换文件中的路径

perl模糊匹配文件名

如何从 Perl 中的一行中提取非空白组?

在perl中搜索两个匹配项

perl 多fasta文件匹配,并提取匹配文件第一条序列