首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令对表中的一组条目进行汇总。

命令对表中的一组条目进行汇总。
EN

Unix & Linux用户
提问于 2019-09-06 02:54:05
回答 2查看 94关注 0票数 -2

我有一个表,它显示在一个OTU(行)中聚集了多少个ASV(列)。每个ASV由1的值表示。

代码语言:javascript
复制
#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

我想把这张表概述如下:

代码语言:javascript
复制
#OTUID    ASVs
OTU1    ASV_1, ASV_4, ASV_10
OTU2    ASV_2, ASV_5
OTU3    ASV_6, ASV_8, ASV_9

帮帮忙吧。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-09-06 05:02:26

下面的脚本假设您希望为每个输入行上的所有列(在第一个标题行之后)打印列名称,这些列的值 1

代码语言:javascript
复制
#!/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一起执行,并按如下方式运行:

代码语言:javascript
复制
$ ./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
EN

Unix & Linux用户

发布于 2019-09-11 15:05:39

代码语言:javascript
复制
$ 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

<#>结果:

代码语言:javascript
复制
#OTUID  ASVs
OTU1    ASV_1, ASV_4, ASV_10
OTU2    ASV_2, ASV_5
OTU3    ASV_6, ASV_8, ASV_9
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/539295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档