Transponieren von Daten in der Datei

Transponieren von Daten in der Datei

Ich habe den folgenden Datensatz in einer Textdatei gespeichert:

Case name                    Case_12                                                                                                                
d1                           0.2                                                                                
d2                           0.1                                                                                
d3                           2.2                                                                                 
d4                           1.29                                                                                
d5                           0                                                                                     
d6                          -1.10                                                                                
d7                           0.007                                                                                
d8                          -0.421                                                                                
d9                          -0.680                                                                                
d10                         -0.206                                                                                

Case name                    Case_1                                                                                                                 
d1                           0.2                                                                              
d2                           0.1                                                                              
d3                           2.2                                                                               
d4                           1.17                                                                              
d5                           0                                                                                   
d6                          -1.09                                                                              
d7                           0.003                                                                              
d8                          -0.458                                                                              
d9                          -0.640                                                                              
d10                         -0.030                                                                              

Case name                    Case_2                                                                                                              
d1                           0.2                                                                              
d2                           0.1                                                                              
d3                           2.2                                                                               
d4                           1.15                                                                              
d5                           0                                                                                   
d6                          -1.17                                                                              
d7                           0.005                                                                              
d8                          -0.504                                                                              
d9                          -0.670                                                                              
d10                         -0.023  

Gibt es eine Möglichkeit, die folgenden Daten so nachzubearbeiten, dass die Ausgabe wie folgt aussieht:

Case name         d1         d2         d6         d7         d8         d9         d10                   
Case_1           0.2         0.1      -1.09      0.003      -0.458     -0.640      -0.030
Case_2           0.2         0.1      -1.17      0.005      -0.504     -0.670      -0.023
Case_12           0.2         0.1      -1.10      0.007      -0.421     -0.680      -0.206

Danke für die Hilfe!

Antwort1

Wenn die Anzahl der ds in jeder Gruppe gleich ist und sortiert ist, können wir Folgendes tun:

<infile awk -v d=10 '
        BEGIN{ printf "Case_name" ;
               while (i++<d) { printf FS "d"i; };
               print "";
             }
        /Case name/{ if (line) { print line }; line=$NF; next }
        { line = line FS $NF; }
        END{ print line }' |column -t

ein weiterer alternativer Ansatz, um die manuelle Generierung von Headern auf dS zu vermeiden:

<infile awk '
        /Case name/{ if (h && !is_h) { print h; is_h=1 };
                     if (line) { print line; }; 
                     h="Case_name"; line= $NF; 
                     next;
                   }
        !is_h { h= (h? h FS $1 : $1); }
        { line= (line? line FS $NF : $NF); }
        END{ print line }' |column -t

Ausgabe:

Case_name  d1   d2   d3   d4    d5  d6     d7     d8      d9      d10
Case_12    0.2  0.1  2.2  1.29  0   -1.10  0.007  -0.421  -0.680  -0.206
Case_1     0.2  0.1  2.2  1.17  0   -1.09  0.003  -0.458  -0.640  -0.030
Case_2     0.2  0.1  2.2  1.15  0   -1.17  0.005  -0.504  -0.670  -0.023

verwandte Informationen