Chris Down ha già mostrato come ottenere qualcos'altro per regexps usando un'istruzione esplicita "if" in un blocco. Puoi anche ottenere lo stesso effetto in altri modi, anche se la sua soluzione è probabilmente migliore.
Uno è scrivere una terza regex che corrisponderà solo al testo non abbinato agli altri, nel tuo caso, sarebbe simile a questo:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Nota, questo usa regexps ancorati - il ^ all'inizio della regexps corrisponderà solo all'inizio di una riga - i tuoi schemi originali non lo hanno fatto, il che rallenta leggermente la corrispondenza poiché controllerà tutti i caratteri su una riga anziché saltando fino alla riga successiva. Il terzo caso ("else") corrisponderà a una riga che inizia con un carattere che non è 'R' ([^ R]) o che inizia con una 'R' seguita da un carattere che non è un '1' o ' 2 '(R [^ 12]). I due diversi significati di ^ sono alquanto confusi, ma quell'errore è stato fatto molto tempo fa e non verrà cambiato molto presto.
Per usare regexps complementari, hanno davvero bisogno di essere ancorati, altrimenti altrimenti [^ R] corrisponderebbe ad esempio al 1 che lo segue. Per regexps molto semplici come te, questo approccio può essere utile, ma man mano che le regexps diventano più complesse, questo approccio diventerà ingestibile. Invece, puoi usare le variabili di stato per ogni riga, in questo modo:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Questo imposta a zero per ogni nuova riga, quindi a 1 se corrisponde a una delle due regexps e infine, se è ancora zero, esegue la stampa $ 0.