2 votes

Comment combiner des lignes doubles en conservant toutes les données uniques dans la colonne 2 ?

J'essaie de fusionner des lignes identiques sur la base de l'identifiant de la colonne 1. Les informations de la colonne 2 ne sont pas nécessairement identiques. Comment puis-je fusionner des doubles en conservant tous les enregistrements uniques de la deuxième colonne ?

Exemple des trois premières lignes de mes données :

>TRINITY_DN100377_c0_g1  GO:0046556,GO:0009044,GO:0045493,
>TRINITY_DN10038_c0_g1  GO:0005783,GO:0005789,GO:0016021,GO:0004581,
>TRINITY_DN10038_c0_g1   GO:0005789,GO:0004598

Je veux avoir :

>TRINITY_DN100377_c0_g1  GO:0046556,GO:0009044,GO:0045493,
>TRINITY_DN10038_c0_g1  GO:0005783,GO:0005789,GO:0016021,GO:0004581,GO:0004598,

Il suffit donc de fusionner les doubles mais en gardant tous les uniques de la colonne 2.

J'utilise :

cat file | sort -u | awk '!seen[$1]++' > newfile

Mais cela a pour seul résultat que la première rangée de doubles est conservée, les autres sont supprimées.

Quelqu'un peut-il m'aider ? Comment puis-je conserver tous les termes GO uniques ?

2voto

Ed Morton Points 25374
$ cat tst.awk
$1 != prev {
    printf "%s%s  ", (NR>1 ? ORS : ""), $1
    delete seen
    prev = $1
}
{
    n = split($2,tmp,/,/)
    for (i=1; i<=n; i++) {
        val = tmp[i]
        if ( (val != "") && !seen[val]++ ) {
           printf "%s,", val
        }
    }
}
END { print "" }
$
$ awk -f tst.awk file
>TRINITY_DN100377_c0_g1  GO:0046556,GO:0009044,GO:0045493,
>TRINITY_DN10038_c0_g1  GO:0005783,GO:0005789,GO:0016021,GO:0004581,GO:0004598,

1voto

POW Points 330

Si l'ordre ne vous dérange pas (GNU awk) :

awk -F'[, ]*' '{for (i=2;i<=NF;i++) if($i!="")a[$1][$i]}END{for(k in a){printf "%s ", k; for(j in a[k]) printf "%s,", j;print ""}} ' file
>TRINITY_DN100377_c0_g1 GO:0046556,GO:0009044,GO:0045493,
>TRINITY_DN10038_c0_g1 GO:0004581,GO:0005783,GO:0004598,GO:0016021,GO:0005789,

Et si vous voulez enlever le dernier , :

awk -F'[, ]*' '{for (i=2;i<=NF;i++) if($i!="")a[$1][$i]}END{for(k in a){e=sprintf("%s ", k); for(j in a[k]) e=e sprintf("%s,", j);sub(/.$/,"",e);print e}} ' file
>TRINITY_DN100377_c0_g1 GO:0046556,GO:0009044,GO:0045493
>TRINITY_DN10038_c0_g1 GO:0004581,GO:0005783,GO:0004598,GO:0016021,GO:0005789

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X