Se você não quiser mover para um banco de dados SQL real, e armazenar temporariamente o resultado não for possível, você terá que certificar-se de não executar SELECT e UPDATE simultâneos na mesma tabela.
Veja a diretiva LIMIT para SELECT.
então você faria algo como:
line=x
while [ -n "$line" ]
do
line=$(sqlite3 database.db "select NUMBER from table WHERE STATUS = 'N'" LIMIT 1)
SELECTION=$(echo $line | awk -F'|' '{ print $1 }')
[some magic]™
sqlite3 database.db "update table SET STATUS='Y' WHERE NUMBER='$SELECTION'"
done
Isso faria com que o SELECT sempre retornasse apenas um resultado e finalizasse, o qual você processaria e UPDATE, e executaria novamente o SELECT para obter o próximo resultado (como STATUS alterado, SELECT receberia o próximo valor, não o antigo, pois não corresponderia mais "N")
ou talvez você pudesse fazer "alguma mágica (tm)" via SQL ao invés de um shell, então você poderia descarregar todo o trabalho no mecanismo SQL ...