Perl:删除两个文件之间的唯一行

时间:2016-09-02 02:21:15

标签: regex perl

我没有删除重复的行,而是想要删除两个文件之间找到的唯一行。文件格式不同。

文件1:

m160505_031746_42156_s1_p0|105337|10450_16161
m160505_031746_42156_s1_p0|104750|20537_27903
m160505_031746_42156_s1_p0|103809|17563_25308
m160505_031746_42156_s1_p0|103217|8075_11486 

文件2(标签分隔):

acCAATCCCATCACCATCtt    m160505_031746_42156_s1_p0|105337|10450_16161
atTAAAATACCATTATATgg    m160505_031746_42156_s1_p0|104750|20537_27903
caAACTCCAACTACGAACtg    m160505_031746_42156_s1_p0|103809|17563_25308
atCTATTTAAACCTAATCgg    m160505_031746_42156_s1_p0|103217|8075_11486
acCAATCCCATCACCATCtt    m160505_031746_42156_s1_p0|152092|36592_40830
atTAAAATACCATTATATgg    m160505_031746_42156_s1_p0|143825|13009_23809
caAACTCCAACTACGAACtg    m160505_031746_42156_s1_p0|143710|0_20191
atCTATTTAAACCTAATCgg    m160505_031746_42156_s1_p0|140833|25358_34709

文件2与第2列中的文件1具有相同的行,在第1列中以20个字母开头。第1列中的20个字母模式在文件2中重复(多次,多于两次),具有唯一的关联序列每次出现。

我想将文件1中的序列与文件2中的第二列匹配。如果匹配,我想为每个匹配生成一个包含两列的新文件,保持文件2之间的关系两列。实际上,我希望简单地删除文件2中没有文件1中的第2列匹配的行。

我意识到我的代码需要帮助,但到目前为止,这是我所拥有的更多关于我如何思考的想法。我可能最终需要使用哈希,尽管由于第1列中的重复而我担心这样做。我不想丢失这些以及它们与第2列的关系。

use strict;
use warnings;

open(OUT, '>', '/path/to/out.txt') or die $!;
open(FMT0, '<', '/path/to/fmt0.txt') or die $!;

my $regex = qr/m160505_.*/;
while(my $line = <FMT0>){
    $line =~ $regex;
    open(FMT6, '<', '/path/to/fmt6.txt') or die $!;
    while(my $zero_fmt = <FMT6>){
            if ($zero_fmt =~ /([A-Z]{20})\t($line)/i){
                    print OUT $zero_fmt;
            }
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这样的事情可能会完成工作。 : - )

grep -f <(grep ^m160505_ file1) file2

这是一个Perl解决方案,因为这就是你所问的:

#!/usr/bin/env perl

use strict;
use warnings;

die "usage: $0 <file1> <file2>\n"
  unless @ARGV == 2;

open(my $file1, '<', $ARGV[0])
  or die "Could not open file1: $!\n";

my %keys;
while (<$file1>) {
  chomp;
  $keys{$_} = 1 if /^m160505_/;
}

close($file1);

open (my $file2, '<', $ARGV[1])
  or die "Could not open file2: $!\n";

while (<$file2>) {
  chomp;
  my ($key) = /\t(.+)$/;
  print "$_\n" if $keys{$key};
}

close($file2);

行动中:

$ grep -f <(grep ^m160505_ file1) file2
acCAATCCCATCACCATCtt    m160505_031746_42156_s1_p0|105337|10450_16161
atTAAAATACCATTATATgg    m160505_031746_42156_s1_p0|104750|20537_27903
caAACTCCAACTACGAACtg    m160505_031746_42156_s1_p0|103809|17563_25308
atCTATTTAAACCTAATCgg    m160505_031746_42156_s1_p0|103217|8075_11486

$ ./atgc.pl file1 file2
acCAATCCCATCACCATCtt    m160505_031746_42156_s1_p0|105337|10450_16161
atTAAAATACCATTATATgg    m160505_031746_42156_s1_p0|104750|20537_27903
caAACTCCAACTACGAACtg    m160505_031746_42156_s1_p0|103809|17563_25308
atCTATTTAAACCTAATCgg    m160505_031746_42156_s1_p0|103217|8075_11486