![](/img/trans.png)
[英]how to extract a part of header in Fasta file by using Linux command
[英]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.