试试这个版本,它可以处理任意数量的值和标题:
awk '
FNR==1 {for(i=2;i<=NF;i++) {headers[i]=$i}}
FNR>1 {
if (maxrow<FNR) { maxrow=FNR}
rowheaders[FNR]=$1;
for(i=2;i<=NF;i++) {
if (maxvalue<$i) {maxvalue=$i}
if(!values[$1,$i]) {
values[$1,$i]=headers[i]
} else {
values[$1,$i]=values[$1,$i] "," headers[i]
}
}
}
END { for (i=2;i<=maxrow;i++) { for (j=0;j<=maxvalue;j++) { if (values[rowheaders[i],j] && maxlen<length(values[rowheaders[i],j])) { maxlen=length(values[rowheaders[i],j])}}}
printf("%" maxlen "s","ID"); for (i=0;i<=maxvalue;i++) { printf("%s%" maxlen "s",OFS,i)}; printf("\n")
for (i=2;i<=maxrow;i++) {
printf ("%" maxlen "s",rowheaders[i])
for (j=0;j<=maxvalue;j++) {
if (!values[rowheaders[i],j]) {
printf("%s%" maxlen "s",OFS," ")
}
else {
printf("%s%" maxlen "s",OFS,values[rowheaders[i],j])
}
}
printf("\n")
}
}'
测试:
$ awk '
FNR==1 {for(i=2;i<=NF;i++) {headers[i]=$i}}
FNR>1 {
if (maxrow<FNR) { maxrow=FNR}
rowheaders[FNR]=$1;
for(i=2;i<=NF;i++) {
if (maxvalue<$i) {maxvalue=$i}
if(!values[$1,$i]) {
values[$1,$i]=headers[i]
} else {
values[$1,$i]=values[$1,$i] "," headers[i]
}
}
}
END { for (i=2;i<=maxrow;i++) { for (j=0;j<=maxvalue;j++) { if (values[rowheaders[i],j] && maxlen<length(values[rowheaders[i],j])) { maxlen=length(values[rowheaders[i],j])}}}
printf("%" maxlen "s","ID"); for (i=0;i<=maxvalue;i++) { printf("%s%" maxlen "s",OFS,i)}; printf("\n")
for (i=2;i<=maxrow;i++) {
printf ("%" maxlen "s",rowheaders[i])
for (j=0;j<=maxvalue;j++) {
if (!values[rowheaders[i],j]) {
printf("%s%" maxlen "s",OFS," ")
}
else {
printf("%s%" maxlen "s",OFS,values[rowheaders[i],j])
}
}
printf("\n")
}
}' inputfile
ID 0 1 2 3 4 5 6
CNV1 S2,S4 S1,S3,S5
CNV2 S5 S2,S3,S4 S1
CNV3 S2 S1,S4 S3 S5