Deve haver algo mais simples que isso:
awk '
/^ *UPDATE/ { prevsep=";" }
/^ *(SET|WHERE)/{ prevsep="" }
{ if(previous)print previous prevsep; previous = $0; prevsep = sep }
/^ *(UPDATE|SET|WHERE)/{ prevsep="" }
/^ *SET/ { sep="," }
/^ *WHERE/{ sep=" and" }
END { print previous ";" }'
Cada linha é lembrada em previous
e impressa com um conjunto de separadores anterior
de um separador sep
acionado após essa linha pelas palavras-chave UPDATE SET WHERE. Essas palavras-chave também limpam o separador anterior (ou definem como ;
), portanto, a linha anterior é impressa sem vírgula ou and
.