4 votes

Conversion des données en lignes en colonnes

Mon fichier d'entrée délimité par des tabulations se présente comme suit :

13435    830169  830264  a    95   y    16
09433    835620  835672  x    46
30945    838405  838620  a    21   c    19
94853    850475  850660  y    15
04958    865700  865978  c    16   a    98

Après les trois premières colonnes, le fichier indique la variable et sa valeur dans la colonne suivante. Je dois modifier la structure des données de sorte qu'après les trois premières colonnes, il y ait des colonnes pour les variables comme ceci :

                         a    x    y    c   
13435    830169  830264  95        16
09433    835620  835672       46
30945    838405  838620  21             19
94853    850475  850660            15
04958    865700  865978  98             16

Existe-t-il un code permettant de faire cela sous linux ? La taille du fichier est de 7,6 Mo et le nombre total de lignes est d'environ 450 000. Le nombre total de variables est de quatre.

Merci de votre attention.

1voto

dawg Points 26051

Voici un awk pour faire cela :

awk '
BEGIN{fmt="%s\t%s\t%s\t%s\t%s\t%s\t%s\n"}
NR==FNR{if ($4 && !($4 in seen)) {
            seen[$4]=++col; cols[col]=$4
        }
        if ($6 && !($6 in seen)) {
            seen[$6]=++col; cols[col]=$6
        }
    next
}
FNR==1{printf fmt, "\t","\t","\t",cols[1],cols[2],cols[3],cols[4]}
{   split("",fields)
    fields[seen[$4]]=$5; fields[seen[$6]]=$7
    printf fmt, $1,$2,$3,fields[1],fields[2],fields[3],fields[4]
}
' file file 

Cela permet de trouver les noms des variables et de les imprimer dans l'ordre dans lequel elles ont été vues en premier.

Impressions :

                        a   y   x   c
13435   830169  830264  95  16      
09433   835620  835672          46  
30945   838405  838620  21          19
94853   850475  850660      15      
04958   865700  865978  98          16

Si vous connaissez vos variables à l'avance et que vous souhaitez indiquer l'ordre des colonnes, vous pouvez le faire :

awk '
BEGIN{
    fmt="%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
    seen["a"]=1;seen["x"]=2;seen["y"]=3;seen["c"]=4
}

FNR==1{printf fmt, "\t","\t","\t","a","x","y","c"}
{   split("",fields)
    fields[seen[$4]]=$5; fields[seen[$6]]=$7
    printf fmt, $1,$2,$3,fields[1],fields[2],fields[3],fields[4]
}
' file

Impressions :

                        a   x   y   c
13435   830169  830264  95      16  
09433   835620  835672      46      
30945   838405  838620  21          19
94853   850475  850660          15  
04958   865700  865978  98          16

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