awk: crear matriz de confusión

En machine learning una forma muy común de mostrar los resultados de un modelo aplicado a un problema de clasificación es a través de una matriz de confusión. El siguiente script de awk crea una matriz de confusión a partir de un fichero donde la primera columna es la salida del modelo (binaria, 0 ó 1) y la segunda columna es la variable de salida real (también binaria, 0 ó 1):
BEGIN{tp=0;tn=0;fp=0;fn=0}
{
   if($1==0)
      $2==0? tn++ : fn++
   else if ($1==1)
      $2==1? tp++ : fp++
}
END{
   printf("\nConfusion matrix:\n")
   printf("+-----+------------+\n")
   printf("| A\\P |   0     1  |\n")
   printf("+-----+------------+\n")
   printf("|  0  | %4d  %4d |\n",tn,fp)
   printf("|  1  | %4d  %4d |\n",fn,tp)
   printf("+-----+------------+\n")
   printf("\nA=Actual, P=Predicted\n\n")
   tpr = tp/(tp+fn)
   tnr = tn/(fp+tn)
   printf("Sensitivity = %g%\n", tpr*100)
   printf("Specificity = %g%\n", tnr*100)
   printf("Accuracy (balanced) = %g%\n", (tpr+tnr)/2*100)
}
Un uso bastante común de este script es cuando tenemos un fichero con datos de test (data.test) donde cada columna representa una variable, separadas por comas. Una de esas columnas es la variable de salida (clase 0 ó clase 1). Para este ejemplo, vamos a suponer que dicha variable de salida se encuentra en la primera columna. Además, en un fichero aparte (modelo.output) tendríamos una única columna con la salida de nuestro modelo de clasificación aplicado en ese mismo fichero de test. En este caso, el script anterior se usa de la siguiente manera:
cut -d"," -f1 data.test | paste -d" " modelo.output - | awk -f conf_matrix.awk 
La salida del comando anterior (suponiendo que el script de awk se encuentra en el fichero conf_matrix.awk) sería algo del estilo:
Accuracy = 71.4286% (220/308) (classification)

Confusion matrix:
+-----+------------+
| A\P |   0     1  |
+-----+------------+
|  0  |  194    74 |
|  1  |   14    26 |
+-----+------------+

A=Actual, P=Predicted

Sensitivity = 65%
Specificity = 72.3881%
Accuracy (balanced) = 68.694%

Updated: