Arreglando archivos csv rotos usando awk

Tengo algunos archivos csv que están rotos porque hay basura, como caracteres de control, entradas y delimitadores en algunos de los campos. Un ejemplo de datos de maqueta sin caracteres de control:

id;col 1;col 2;col 3
1;data 11;good 21;data 31
2;data 12;cut
in two;data 32
3;data 13;good 23;data 33
4;data 14;has;extra delimiter;data 34
5;data 15;good 25;data 35
6;data 16;cut
and;extra delimiter;data 36
7;data 17;data 27;data 37
8;data 18;cut
in 
three;data 38
9;data 19;data 29;data 39

Estoy procesando la basura anterior con awk:

BEGIN { FS=OFS=";" }       # delimiters
NR==1 { nf=NF; }           # header record is fine, use the NF
NR>1 {
    if(NF<nf) {            # if NF less that header's NF
        prev=$0            # store $0
        if(getline==1) {   # read the "next" line
            succ=$0        # set the "next" line to succ
            $0=prev succ   # rebuild a current record
        }
    }
    if(NF!=nf)             # if NF is still not adequate
        $0=succ            # expect original line to be malformed
    if(NF!=nf)             # if the "next" line was malformed as well
        next               # well skip "next" line and move to next
} 1

Naturalmente, el programa anterior fallará en los registros4 y6 (ya que los datos reales tienen varios campos donde el delimitador adicional puede estar al acecho) y8 (ya que solo leo la siguiente línea siNF es demasiado corto. Puedo vivir perdiendo4 y6 pero8 podría ser factible?

Además, tres sucesivosifs grito por unfor bucle pero es viernes por la tarde aquí y mi día se acerca$ y ya no puedo girar la cabeza. ¿Tienen alguna reserva cerebral que me pueda prestar? ¿Alguna mejor práctica que no haya pensado?

Respuestas a la pregunta(1)

Su respuesta a la pregunta