Transponieren Sie mit AWK oder Perl

Hallo, ich möchte AWK oder Perl verwenden, um eine Ausgabedatei im folgenden Format zu erhalten. Meine Eingabedatei ist eine durch Leerzeichen getrennte Textdatei. Dies ähnelt einer früheren Frage von mir, aber in diesem Fall hat die Eingabe und Ausgabe keine Formatierung. Meine Spaltenpositionen können sich ändern, daher wäre eine Technik wünschenswert, die sich nicht auf die Spaltennummer bezieht

Eingabedatei

id quantity colour shape size colour shape size colour shape size
1 10 blue square 10 red triangle 12 pink circle 20
2 12 yellow pentagon 3 orange rectangle 4 purple oval 6

Gewünschte Ausgabe

id colour shape size
1 blue square 10
1 red triangle 12
1 pink circle 20
2 yellow pentagon 3
2 orange rectangle 4
2 purple oval 6

Ich benutze diesen Code von Dennis Williamson. Das einzige Problem ist, dass die Ausgabe, die ich erhalte, keine Raumtrennung in den transponierten Feldern aufweist. Ich benötige eine Raumtrennung

#!/usr/bin/awk -f
BEGIN {
col_list = "quantity colour shape"
# Use a B ("blank") to add spaces in the output before or
# after a format string (e.g. %6dB), but generally use the numeric argument

# columns to be repeated on multiple lines may appear anywhere in
# the input, but they will be output together at the beginning of the line
repeat_fields["id"]
# since these are individually set we won't use B
repeat_fmt["id"] = "%-1s "
# additional fields to repeat on each line

ncols = split(col_list, cols)

for (i = 1; i <= ncols; i++) {
    col_names[cols[i]]
    forms[cols[i]] = "%-1s"
}
}


# save the positions of the columns using the header line
FNR == 1 {
for (i = 1; i <= NF; i++) {
    if ($i in repeat_fields) {
        repeat[++nrepeats] = i
        repeat_look[i] = i
        rformats[i] = repeat_fmt[$i]
    }
    if ($i in col_names) {
        col_nums[++n] = i
        col_look[i] = i
        formats[i] = forms[$i]
    }
}
# print the header line
for (i = 1; i <= nrepeats; i++) {
    f = rformats[repeat[i]]
    sub("d", "s", f)
    gsub("B", " ", f)
    printf f, $repeat[i]
}
for (i = 1; i <= ncols; i++) {
    f = formats[col_nums[i]]
    sub("d", "s", f)
    gsub("B", " ", f)
    printf f, $col_nums[i]
}
printf "\n"
next
}

{
for (i = 1; i <= NF; i++) {
    if (i in repeat_look) {
        f = rformats[i]
        gsub("B", " ", f)
        repeat_out = repeat_out sprintf(f, $i)

    }
    if (i in col_look) {
        f = formats[i]
        gsub("B", " ", f)
        out = out sprintf(f, $i)
        coln++
    }
    if (coln == ncols) {
        print repeat_out out
        out = ""
        coln = 0
    }
}
repeat_out = ""
}

Ausgabe

id quantitycolourshape
1 10bluesquare
1 redtrianglepink
2 circle12yellow
2 pentagonorangerectangle

Ich entschuldige mich dafür, dass ich nicht alle Informationen zu der aktuellen Datei früher aufgenommen habe. Ich habe dies nur der Einfachheit halber getan, aber es hat nicht alle meine Anforderungen erfüllt.

In meiner aktuellen Datei möchte ich die Felder n_cell und n_bsc für NODE SITE CHILD transponieren

NODE SITE CHILD n_cell n_bsc

Hier ist ein Link zu der Datei, an der ich gerade arbeite

Antworten auf die Frage(2)

Ihre Antwort auf die Frage