表の項目クラスターを要約するコマンド

表の項目クラスターを要約するコマンド

1つの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

おすすめ記事