$ awk '
BEGIN {
# set input, output and subscript separator to comma
FS = OFS = SUBSEP = ","
}
NR > 1 {
# keep test-program-area in `a` for future reference
a[$2, $4, $5]
# associate license_used with test-program-area-(high/low/medium) in `b`
b[$2, $4, $5, $1] = $3
}
END {
print "TESTER", "PROGRAM", "AREA", "High", "Low", "Medium"
# for each key in `a`
for (k in a)
# print (test, program, area), high, low, medium
print k, int(b[k, "High"]), int(b[k, "Low"]), int(b[k, "Medium"])
}
' file
TESTER,PROGRAM,AREA,High,Low,Medium
F4309,Element02,PB1,54,0,0
E8123,Element02,FT3,0,48,0
T6712,Element01,FT1,0,0,23
T7911,Element03,FT2,54,0,0
F4309,Element01,PB1,0,48,23
E8123,Element05,FT2,54,0,0
T7911,Element04,FT1,0,0,23
Без пробелов и комментариев, если вы ищете необычную однострочную строку:
awk 'BEGIN {FS=OFS=SUBSEP=","} NR>1{a[$2,$4,$5];b[$2,$4,$5,$1]=$3} END{print "TESTER","PROGRAM","AREA","High","Low","Medium";for(c in a) print k,0+b[k,"High"],0+b[k,"Low"],0+b[k,"Medium"]}' file
Для транспонированного вывода:
$ awk '
BEGIN {
FS = OFS = ","
tr[cell[4, 1] = "High" ] = 4
tr[cell[5, 1] = "Low" ] = 5
tr[cell[6, 1] = "Medium"] = 6
}
{
cell[1, NR] = $2
cell[2, NR] = $4
cell[3, NR] = $5
}
NR > 1 {
cell[tr[$1], NR] = $3
}
END {
for (row = 1; row <= 6; ++row) {
for (col = 1; col <= NR; ++col)
if (row > 3 && col > 1)
$col = int(cell[row, col])
else
$col = cell[row, col]
print
}
}' file
TESTER,T6712,T7911,E8123,F4309,F4309,T7911,E8123,F4309
PROGRAM,Element01,Element03,Element02,Element02,Element01,Element04,Element05,Element01
AREA,FT1,FT2,FT3,PB1,PB1,FT1,FT2,PB1
High,0,54,0,54,0,0,54,0
Low,23,0,0,0,23,23,0,0
Medium,0,0,48,0,0,0,0,48
СортироватьAREA
(т. е. 5-й столбец):
$ awk '
BEGIN {
FS = OFS = ","
tr[cell[4, 1] = "High" ] = 4
tr[cell[5, 1] = "Low" ] = 5
tr[cell[6, 1] = "Medium"] = 6
}
{
cell[1, NR] = $2
cell[2, NR] = $4
cell[3, NR] = $5
}
NR > 1 {
cell[tr[$1], NR] = $3
}
END {
for (row = 1; row <= 6; ++row) {
for (col = 1; col <= NR; ++col)
if (row > 3 && col > 1)
$col = int(cell[row, col])
else
$col = cell[row, col]
print
}
}' <(head -n 1 file) <(tail -n +2 file | sort -t ',' -k 5) # <- 5th
TESTER,T6712,T7911,E8123,T7911,E8123,F4309,F4309,F4309
PROGRAM,Element01,Element04,Element05,Element03,Element02,Element02,Element01,Element01
AREA,FT1,FT1,FT2,FT2,FT3,PB1,PB1,PB1
High,0,0,54,54,0,54,0,0
Low,23,23,0,0,0,0,23,0
Medium,0,0,0,0,48,0,0,48
Примечание : если вы используете оболочку, отличную от bash, и не можете получитьпоследний, который будет работать, отменить процесс замены и использовать группу команд, например:
{ head -n 1 file; tail -n +2 file | sort -t ',' -k 5; } | awk '...'