두 개의 서로 다른 열을 사용하여 여러 파일(2개 이상)을 비교합니다.

두 개의 서로 다른 열을 사용하여 여러 파일(2개 이상)을 비교합니다.

file1, file2, file3, file4의 네 가지 파일이 있습니다. 각 파일에는 탭으로 구분된 2개의 서로 다른 열이 있습니다. file1의 첫 번째 열(참조용)을 두 번째 파일의 첫 번째 열, 세 번째 및 네 번째 파일과 일치시키고 일치하는 첫 번째 열과 각 파일의 일치하는 첫 번째 열을 두 번째 열에 인쇄하고 싶습니다. 파일은 다음과 같습니다:

파일 1

Bm1_00085|Bm1_22625    0.263974289
Bm1_00087|Bm1_22620    0.663443490    

파일 2

Bm1_00085|Bm1_22625    0
Bm1_57630|Bm1_52870    0

파일 3

Bm1_57630|Bm1_54855    0
Bm1_00085|Bm1_22625    4

파일 4

Bm1_57630|Bm1_52870    0
Bm1_00085|Bm1_22625    1

산출:

Bm1_00085|Bm1_22625 0.263974289 0 4 1

답변1

join다음을 처리하는 방법을 알 만큼 똑똑한 쉘을 사용합니다 <(...).

join <(sort file1) <(sort file2) | join - <(sort file3) | join - <(sort file4)

산출:

Bm1_00085|Bm1_22625 0.263974289 0 4 1

답변2

awk를 사용하여 이를 수행하는 한 가지 방법은 다음과 같습니다.

파싱.awk

# Use the first column of the first file as a key and the second column
# as a value in the h hash
NR==FNR { h[$1] = $2; next }

# If $1 is a key in h append $2 to h[$1]
$1 in h { h[$1] = h[$1] OFS $2 }

# When the input has been exhausted, print h key value pairs
# that contain more than one element 
END { for(k in h)
  if(split(h[k], a) > 1)
    print k OFS h[k]
}

다음과 같이 실행하세요:

awk -f parse.awk file1 file2 file3 file4

산출:

Bm1_00085|Bm1_22625 0.263974289 0 4 1

답변3

Perl에서는 이를 수행하는 도구가 해싱입니다. 해시는 키-값 쌍의 집합이므로 상호 참조가 매우 쉽습니다.

참고 - 이렇게 됩니다오직첫 번째 필드가 고유한 경우 작동합니다.

#!/usr/bin/env perl
use strict;
use warnings;
my %data;

while (<>) {
    my ( $key, $value ) = split;
    push( @{ $data{$key} }, $value );
}

foreach my $key ( sort keys %data ) {
    if ( @{ $data{$key} } >= @ARGV ) {
        print join( "\t", $key, @{ $data{$key} } ), "\n";
    }
}

로 호출됩니다 myscript.pl file1 file2 file3 file4.

그것:

  • 명령줄에서 파일 목록을 읽고 <>처리를 위해 엽니다.
  • 한 번에 한 행씩 반복하여 행을 $key합계 로 분할합니다 $value.
  • $value배열의 해시에 저장됩니다 .

  • 해시의 각 키를 반복합니다.

  • 요소 개수 >= 명령줄 인수 개수(예: 파일 개수)인 경우 - 줄을 인쇄합니다.

출력은 다음과 같습니다

Bm1_00085|Bm1_22625 0.263974289 0   4   1

노트:

모든 파일에는 고유한 "키"가 있다고 가정합니다.

관련 정보