首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk:按第一个字段总结一个表&合并后续列

awk:按第一个字段总结一个表&合并后续列
EN

Stack Overflow用户
提问于 2019-02-01 12:15:48
回答 2查看 40关注 0票数 0

我有下表:

代码语言:javascript
复制
id1 0720f5eb2d611dc66e0e9941d516961f    193 PANTHER PTHR34107       7   187 9.50E-16    T   01.02.19                
id2 32912bc00b9b84f6b06600aff56cef8f    138 PANTHER PTHR10302:SF0       2   119 7.00E-42    T   01.02.19    IPR011344   Single-stranded DNA-binding protein GO:0003697|GO:0006260   Reactome: R-HSA-2151201
id2 32912bc00b9b84f6b06600aff56cef8f    138 PANTHER PTHR10302       2   119 7.00E-42    T   01.02.19    IPR000424   Primosome PriB/single-strand DNA-binding    GO:0003697  Reactome: R-HSA-2151201

它由16列组成,并以制表符分隔。

现在,我想以以下方式组合这个表:

  1. 第一栏总结
  2. 连接列,以便将每个id的相同字段从原始表中用;分隔开。

因此,我想要的产出是:

代码语言:javascript
复制
id2 PTHR10302:SF0; PTHR10302        2-119; 2-119    7.0E-42; 7.0E-42    T; T    IPR011344; IPR000424    Single-stranded DNA-binding protein; Primosome PriB/single-strand DNA-binding
id1     PTHR34107       7-187   9.5E-16 T

第2、3、4和10栏可以省略。第7和第8栏由-组合。

我可以通过以下命令求解1.

代码语言:javascript
复制
awk 'BEGIN{FS=OFS="\t"}{unique[$1]=(unique[$1] FS $5 FS $6 FS $7 "-" $8 FS $9 FS $10 FS $12 FS $13); next}END{for (i in unique) print i,unique[i]}'

它由id总结,但不连接字段:

代码语言:javascript
复制
id2     PTHR10302:SF0       2-119   7.0E-42 T   IPR011344   Single-stranded DNA-binding protein PTHR10302       2-119   7.0E-42 T   IPR000424   Primosome PriB/single-strand DNA-binding
id1     PTHR34107       7-187   9.5E-16 T

但是我该怎么做2.

EN

回答 2

Stack Overflow用户

发布于 2019-02-01 23:48:45

这不容易,但这是可能的。

首先,您需要两个数组。一个是'ids'数组,另一个是'data'数组。

对于每一行,您都应该更新‘it’数组(因此它将包含所有可能的it):

代码语言:javascript
复制
  ids[$1] = [$1]

然后,在' data '数组中,您应该存储连接的数据。该数组的索引将是“假的”-多维的:

代码语言:javascript
复制
  data[$1,5] = data[$1,5] ? data[$1,5] "; " $5 : $5
  data[$1,6] = data[$1,6] ? data[$1,6] "; " $6 : $6
  data[$1,78] = data[$1,78] ? data[$1,78] "; " $7 "-" $8 : $7 "-" $8
  data[$1,9] = data[$1,9] ? data[$1,9] "; " $9 : $9
  data[$1,10] = data[$1,10] ? data[$1,10] "; " $10 : $10
  data[$1,12] = data[$1,12] ? data[$1,12] "; " $12 : $12
  data[$1,13] = data[$1,13] ? data[$1,13] "; " $13 : $13

'END'块中,您应该迭代‘In’数组,但是从'data'数组中获取值:

代码语言:javascript
复制
END {
  for (i in ids)
    print i, data[i,$5], data[i,$6], data[i,$78], data[i,$9], data[i,$10], data[i,$12], data[i,$13]
}

P.S.:如果使用更新版本的gawk,有更容易获得结果的方法,因为这些版本支持真正的多维数组。

票数 0
EN

Stack Overflow用户

发布于 2019-02-02 02:19:36

正如@tripleee所提到的,Perl可以这样做。看看这个

代码语言:javascript
复制
$ cat rororo.txt
id1 0720f5eb2d611dc66e0e9941d516961f    193 PANTHER PTHR34107       7   187 9.50E-16    T   01.02.19
id2 32912bc00b9b84f6b06600aff56cef8f    138 PANTHER PTHR10302:SF0       2   119 7.00E-42    T   01.02.19    IPR011344   Single-stranded DNA-binding protein GO:0003697|GO:0006260   Reactome: R-HSA-2151201
id2 32912bc00b9b84f6b06600aff56cef8f    138 PANTHER PTHR10302       2   119 7.00E-42    T   01.02.19    IPR000424   Primosome PriB/single-strand DNA-binding    GO:0003697  Reactome: R-HSA-2151201

$ ./join_tab.pl rororo.txt
id2 PTHR10302:SF0;PTHR10302     2-119;2-119     7.00E-42;7.00E-42       T;T     IPR011344;IPR000424     Single-stranded DNA-binding;Primosome PriB/single-strand
id1 PTHR34107   7-187   9.50E-16        T

$

剧本:

代码语言:javascript
复制
$ cat ./join_tab.pl
perl -lane '
$id=$F[0];
$fs="$F[5]-$F[6]";
$f11="$F[11] $F[12]";
@t4 = @{$kv1{$id}}; push(@t4,$F[4]); $kv1{$id}=[@t4];
@t56 = @{$kv2{$id}}; push(@t56,$fs); $kv2{$id}=[@t56];
@t7 = @{$kv3{$id}}; push(@t7,$F[7]); $kv3{$id}=[@t7];
@t8 = @{$kv4{$id}}; push(@t8,$F[8]); $kv4{$id}=[@t8];
@t10 = @{$kv5{$id}}; push(@t10,$F[10]); $kv5{$id}=[@t10];
@t11 = @{$kv6{$id}}; push(@t11,$f11); $kv6{$id}=[@t11];
END {
while( ($x,$y) = each(%kv1))
{
 @t4=@{$kv1{$x}};  @t56=@{$kv2{$x}};
 @t7 = @{$kv3{$x}};  @t8 = @{$kv4{$x}};
 @t10 = @{$kv5{$x}};  @t11 = @{$kv6{$x}};
 print "$x ", join(";",@t4), "\t",join(";",@t56), "\t",join(";",@t7),"\t",join(";",@t8),"\t",join(";",@t10),"\t",join(";",@t11)   ;
}

} ' $1
$
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54479332

复制
相关文章

相似问题

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