Чистое awk
решение, основанное на ваших полях, разделенных символом табуляции '\t'
, выглядит следующим образом:
awk 'BEGIN { FS = "\t"; PROCINFO["sorted_in"] = "@ind_num_asc" } { if ( $1 !~ /^[0-9]+$/ ) next; A[$1][$2] = $3; H[$2] } END { printf "ID"; for (h in H) printf "\t" h; for (i in A) { printf "\n\n" i; for (j in A[i]) printf "\t" A[i][j] } print "\n" }' filename
И в разбивке:
awk 'BEGIN {
FS = "\t" #Set Field Separator as the Tab
PROCINFO["sorted_in"] = "@ind_num_asc" #Set array order as numbers
}
{
if ( $1 !~ /^[0-9]+$/ ) #Skip all rows without numeric ID
next
A[$1][$2] = $3 #Store value in multi-dimensional array
H[$2] #Store header name
}
END {
printf "ID"
for (h in H) #Print all headers found
printf "\t" h
for (i in A) { #Print each record with corresponding values
printf "\n\n" i
for (j in A[i])
printf "\t" A[i][j]
}
print "\n"
}' filename
Дайте мне знатьесли какие-либо дальнейшие объяснения необходимы.Это будет работать с таким количеством полей, как вы установили и в любом порядке.Если записи не имеют одинаковых полей, ваш вывод может выглядеть неровно.