하나의 OTU(행)에 클러스터된 ASV(열) 수를 보여주는 테이블이 있습니다. 각 ASV는 값 1로 표시됩니다.
#OTUID ASV_1 ASV_2 ASV_3 ASV_4 ASV_5 ASV_6 ASV_7 ASV_8 ASV_9 ASV_10
OTU1 1 0 0 1 0 0 0 0 0 1
OTU2 0 1 0 0 1 0 0 0 0 0
OTU3 0 0 0 0 0 1 0 1 1 0
나는 그 표를 다음과 같이 요약하고 싶다.
#OTUID ASVs
OTU1 ASV_1, ASV_4, ASV_10
OTU2 ASV_2, ASV_5
OTU3 ASV_6, ASV_8, ASV_9
도와주세요.
답변1
다음 스크립트는 열을 인쇄한다고 가정합니다.이름각 입력 행(첫 번째 헤더 행 뒤)에 다음이 포함된 모든 열의 경우값 1
.
#!/usr/bin/perl
use strict;
my @titles=();
while(<>) {
if ($. == 1) {
@titles = split; # get column titles
print "#OTUID\tASVs\n"; # print the new output header
next;
};
chomp;
my @F=split; # split the input line into fields, store in array @F
my @ASVs=(); # @ASV array holds the titles for each matching field.
foreach my $asv (1..$#F) {
push @ASVs, $titles[$asv] if ($F[$asv] == 1);
};
print "$F[0]\t", join(",", @ASVs), "\n";
}
예를 들어 다른 이름으로 저장하고 alex.pl
실행 가능하게 만들고 chmod +x alex.pl
다음과 같이 실행합니다.
$ ./alex.pl input.txt
#OTUID ASVs
OTU1 ASV_1,ASV_4,ASV_10
OTU2 ASV_2,ASV_5
OTU3 ASV_6,ASV_8,ASV_9
답변2
$ perl -lane '$,="\t";
$. == 1 and do{ $h{$_} = $F[$_] for 1..$#F; print $F[0], "ASVs"; next; };
print $F[0], join ", ", map { $h{$_} } grep { $F[$_] == 1 } 1..$#F;
' file
결과:
#OTUID ASVs
OTU1 ASV_1, ASV_4, ASV_10
OTU2 ASV_2, ASV_5
OTU3 ASV_6, ASV_8, ASV_9