테이블의 항목 클러스터를 요약하는 명령

테이블의 항목 클러스터를 요약하는 명령

하나의 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

관련 정보