Надеюсь, вы сможете помочь. Я совершенно новичок в g) awk, и я боролся с ним в течение последних двух недель.Транспонирование данных на основе уникального ID - awk
Мой первоначальный файл выглядит следующим образом: есть столбец с уникальным идентификатором и другой с уникальными именами. Последующие столбцы представляют собой различные курсы, и каждое поле содержит (если не пусто) знак для каждого курса и для каждого ученика. Таким образом, каждый студент имеет только один знак для каждого курса:
Id Name Course1 Course2 Course3 Course4 Course5
1 John 55
2 George 63
4 Alex 64
1 John 74
3 Emma 63
2 George 64
4 Alex 60
2 George 29
3 Emma 69
1 John 67
3 Emma 80
4 Alex 57
2 George 91
1 John 81
1 John 34
3 Emma 75
2 George 89
4 Alex 49
3 Emma 78
4 Alex 69
5 TERRY 67
6 HELEN 39
Это то, что я хочу достичь - транспонирование данных, то есть знаки, на основе уникального идентификатора и поместить знаки ниже каждого соответствующего курса, как показано ниже:
Id Name Course1 Course2 Course3 Course4 Course5
1 John 55 69 64 60 49
2 George 29 64 89 91 63
3 Emma 63 80 75 78 69
4 Alex 57 69 64 60 49
5 TERRY 67
6 HELLEN 39
Это то, что мне удалось получить до сих пор:
Id Name Course1 Course2 Course3 Course4 Course5
1 John 55
2 George 29
3 Emma 63
4 Alex 57
5 TERRY
6 HELLEN
1 John 69
2 George 64
3 Emma 80
4 Alex 69
5 TERRY 67
6 HELLEN
1 John 64
2 George 89
3 Emma 75
4 Alex 64
5 TERRY
6 HELLEN 39
...and so on
Это действительно немного сложно для меня, чтобы достичь на основе того, что я уже знаю на AWK (обратите внимание, я не заинтересован в SED/Perl и т.д. основанные на решениях). Если вам нужна помощь (желательно НЕ один лайнер), я могу попросить вас немного описать, поскольку меня интересует решение так же, как и в самом методе.
Любая помощь будет очень оценена.
EDIT Вот код, который я написал, чтобы достигнуть последней стадии (и где я застрял)
#!/bin/bash
files3="*.csv"
for j in $files3
do
#echo "processing $j..."
fi13=$(awk -F" " '(NR==1){field13=$13;}{print field13}' ./work1/test1YA.csv)
fi14=$(awk -F" " '(NR==1){field14=$14;}{print field14}' ./work1/test1YA.csv)
fi15=$(awk -F" " '(NR==1){field15=$15;}{print field15}' ./work1/test1YA.csv)
fi16=$(awk -F" " '(NR==1){field16=$16;}{print field16}' ./work1/test1YA.csv)
# awk -F" " 'BEGIN{OFS=" ";RS="\n"}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' "$j" >> ./work1/test2YA.csv
awk -F" " -v f13="$fi13" -v f14="$fi14" -v f15="$fi15" -v f16="$fi16" '{if($13==f13){$13=$6;$14=$15=$16=""}if($13==f14){$14=$6;$13=$15=$16=""}if($13==f15){$15=$6;$13=$14=$16=""}if($13==f16){$16=$6;$13=$14=$15=""}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}}' "$j" >> ./work1/test2YA.csv
done;
awk -F" " 'BEGIN{print "ID","Title","FirstName","MiddleName","LastName","FinalMarks","Status","Username","Campus","Code","Programme","Year","course1","course2","course3","course4"}{print}' ./work1/test2YA.csv >> ./work1/test3YA.csv
Можете ли вы вставить код, создающий ваше решение на полпути? – choroba