Em bash , '...' são aspas strongs, então com '\n' , um literal \n é passado para awk e com '\n' , um literal \n . Não há transformação.
Em awk , dentro de "..." , \n e \ ... são expandidos. Assim, quando passado "\n" a gensub() (ou print ou qualquer coisa em awk ), esse é um caractere de nova linha real e, quando passado "\" , é \ .
Agora, gensub() também entende seu primeiro argumento como uma expressão regular, em que \ também tem um significado especial que varia entre as implementações.
O que é consistente entre as implementações é que \ regexp corresponde a um literal \ , assim como \. corresponde a um literal . . No entanto, para um \n regexp, se isso corresponde a um caractere de nova linha ou a n varia com a implementação. No caso de gawk , que corresponde à nova linha. Portanto, gensub("\n", "x") e gensub("\n", "x") substituem caracteres de nova linha por x , o primeiro porque um caractere literal de nova linha é passado para gensub() , o segundo porque \n é passado para gensub() , que é entendido como um regexp que corresponde a um caractere de nova linha.
Observe que a especificação POSIX costumava ter vários problemas quando se tratava de processamento de contrabarra em expressões regulares em awk . Isso será corrigido na próxima versão da especificação. Consulte o link para obter detalhes.
Fica ainda mais confuso ao usar /\n/ em vez de "\n" .