2016-09-02 23 views
0

重複する行を削除するのではなく、2つのファイル間で見つかった一意の行を削除することに興味があります。ファイルの形式は異なります。Perl:2つのファイル間の一意の行を削除する

ファイル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カラム1. 20の文字が先行し、カラム2にファイル1と同じラインを有します列1の20文字のパターンがファイル2で繰り返され(数回、単なる2回以上)

ファイル2の2番目の列にファイル1のシーケンスを一致させたいとします。一致するものがある場合は、ファイル2の関係を維持しながら、 2つの列の間。実際には、ファイル2の行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

@Sebastian Lenartowicz私は少し私の質問をクリーンアップを支援してくれてありがとう。 – Rob

答えて

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 
+0

素晴らしい!ありがとう。あなたはgrepについては正しいですが、私は本当にこのためのあなたのperlの答えを感謝します。多くの人が重複した行を削除したいと思います。私はこの質問で苦労していた。あなたはそれを見やすくしました! :) – Rob

+0

別のファイルの行と一致する1つのファイル内の行を見つけることは、一般的なUnixコマンドラインタスクの多少です。お力になれて、嬉しいです。 – mwp

関連する問題