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
노트:
모든 파일에는 고유한 "키"가 있다고 가정합니다.