2016-09-02 5 views
0

중복 된 줄을 제거하는 대신 두 파일 사이에있는 고유 한 줄을 제거하는 데 관심이 있습니다. 파일 형식이 다릅니다.Perl : 두 파일 사이의 고유 한 줄 제거

파일 1 : 2 (탭 구분)

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 

파일 :

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의 두 번째 열과 파일 1의 순서를 일치시키고 싶습니다. 일치하는 것이 있으면 파일 2와의 관계를 유지하면서 각 일치에 대해 두 개의 열이있는 새 파일을 생성하고 싶습니다 두 열 사이. 실제로 File 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; 
      } 
    } 
} 

감사 컬럼에 그와의 관계를 잃고 싶지 않지만 나는 아마 해시를 사용할 필요 끝날 것 도움!

+0

@Sebastian Lenartowicz 감사 . – Rob

답변

2

이렇게하면 작업이 완료 될 수 있습니다. 그건 당신이 무엇을 요구 이후 :-)

grep -f <(grep ^m160505_ file1) file2 

는 여기에 펄 솔루션입니다 :

행동
#!/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에 대해 옳았 습니다만, 저는이 사실에 대한 당신의 펄 대답에 정말 감사하고 있습니다. 많은 사람들이 고유 라인이 아닌 중복 라인을 제거하기를 원합니다. 나는이 질문에 어려움을 겪고 있었다. 당신은 그것을보기 쉽게 만들었습니다! :) – Rob

+0

한 파일에서 다른 파일의 행과 일치하는 줄을 찾는 것은 일반적인 유닉스 명령 줄 작업 중 일부이므로 일단 몇 번 본 적이 있으면 솔루션이 자연스럽게 나타납니다! 도와 줄 수있어서 기뻐. – mwp

관련 문제