Предполагая, что между строками данных нет пустых строк и используется GNU awk для сортировки _в:
$ cat tst.awk
BEGIN { FS=OFS="," }
FNR==1 {
delete f
for (i=1; i<=NF; i++) {
f[$i] = i
flds[$i]
}
numFiles++
next
}
{
for (tag in f) {
val[numFiles,tag] = $(f[tag])
}
}
END {
PROCINFO["sorted_in"] = "@val_str_asc"
sep = ""
for (tag in flds) {
printf "%s%s", sep, tag
sep = OFS
}
print ""
for (fileNr=1; fileNr<=numFiles; fileNr++) {
sep = ""
for (tag in flds) {
printf "%s%s", sep, val[fileNr,tag]
sep = OFS
}
print ""
}
}
.
$ awk -f tst.awk file{1..3}
A,B,C,D,E,F
10,20,10,20,,5
,20,10,20,5,10
,,,10,30,20