Transponuj za pomocą AWK lub Perla

Hi Chciałbym użyć AWK lub Perla, aby uzyskać plik wyjściowy w poniższym formacie. Mój plik wejściowy to plik tekstowy oddzielony spacjami. Jest to podobne do mojego wcześniejszego pytania, ale w tym przypadku wejście i wyjście nie ma formatowania. Moje pozycje kolumn mogą się zmienić, więc doceniłbym technikę, która nie odnosi się do numeru kolumny

Plik wejściowy

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

Pożądane wyjście

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

Używam tego kodu przez Dennisa Williamsona. Jedynym problemem jest to, że dane wyjściowe nie mają oddzielenia przestrzeni w transponowanych polach. Potrzebuję jednej separacji przestrzeni

#!/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 = ""
}

Wydajność

id quantitycolourshape
1 10bluesquare
1 redtrianglepink
2 circle12yellow
2 pentagonorangerectangle

Przepraszam, że wcześniej nie włączyłem wszystkich informacji o rzeczywistym pliku. Zrobiłem to tylko dla uproszczenia, ale nie uchwycił wszystkich moich wymagań.

W moim aktualnym pliku szukam transpozycji pól n_cell i n_bsc dla NODE SITE CHILD

NODE SITE CHILD n_cell n_bsc

Oto link do rzeczywistego pliku, nad którym pracuję

questionAnswers(2)

yourAnswerToTheQuestion