繁体   English   中英

如何使用 linux 命令提取 ID 和密钥?

[英]How to extract the ids and keys using linux command?

我有与第二列的键值匹配的 id 列表,我想删除重复项并将相应的值保留为逗号或冒号分隔,如输出格式输入文件所示

TRINITY_DN728479_c0_g1_i1   GO:0003674
TRINITY_DN728479_c0_g1_i1   GO:0003824
TRINITY_DN728479_c0_g1_i1   GO:0003887
TRINITY_DN728480_c0_g1_i1   GO:0003891
TRINITY_DN728480_c0_g1_i1   GO:0003892

我想要输出

TRINITY_DN728479_c0_g1_i1        GO:0003674, GO:0003824, GO:0003887
TRINITY_DN728480_c0_g1_i1        GO:0003891,GO:0003892

我试过 awk 但它不起作用

awk -vORS=, '{ print $2 }' Gene.GO | sed 's/,$/\n/'

第一个解决方案:使用您显示的示例,请尝试以下awk代码。 如果您的第一个字段未排序,则使用带有awk代码的sort

sort -t_ -k1 -k2 Input_file | 
awk '
  BEGIN{ OFS="\t" }
  prev!=$1 && prev{
    print prev,value
    value=""
  }
  {
    value=($1 in value ? value[$1] s1: "")$2
    prev=$1
  }
  END{
    if(prev && value){
      print prev,value
    }
  }
'

第二个解决方案:只有awk解决方案,这将为您提供与 Input_file 中第一个字段相同的输出顺序。

awk '
BEGIN{ s1=","; OFS="\t" }
!arr1[$1]++{
  arr2[++count]=$1
}
{
  value[$1]=($1 in value ? value[$1] s1: "")$2
}
END{
  for(i=1;i<=count;i++){
    print arr2[i],value[arr2[i]]
  }
}
' Input_file

第三种解决方案:如果您不担心输出中第一个字段的顺序,请尝试以下操作。

awk '
BEGIN{ s1=",";OFS="\t" }
{
  value[$1]=($1 in value ? value[$1] s1: "")$2
}
END{
  for(i in value){
    print i, value[i]
  }
}
'  Input_file

如果输入是 2 列并且已经按第 1 列分组

awk '
{
  printf "%s", ($1==p ? "," $2 : ors $0)
  ors = ORS
  p = $1
} END {printf "%s", ors}' file

使用datamash

$ datamash -W -g1 collapse 2 <ip.txt 
TRINITY_DN728479_c0_g1_i1   GO:0003674,GO:0003824,GO:0003887
TRINITY_DN728480_c0_g1_i1   GO:0003891,GO:0003892
  • -W使用空格/制表符作为字段分隔符
  • -g1按第1列分组
  • collapse 2以根据第1列键收集第2列中的所有值

如果输入未排序,请使用-s选项或通过管道传输来自sort命令的输入。 输出字段分隔符是这里的选项卡,您可以使用--output-delimiter选项进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM