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 .