$ awk '{ f = substr($0,1,2) ".txt"; print >f }' file.in
$ ls
ab.txt b2.txt file.in k9.txt vr.txt
$ cat ab.txt
abWEye7kgw7
abff34ZSrZf
abke8mzMyma
Isso obviamente pode ser resolvido no shell também, mas awk é mais adequado para analisar arquivos de texto. O substr() seleciona os dois primeiros caracteres de cada linha no arquivo de entrada, e isso é atribuído à variável f com .txt adicionada ao final. O print emitirá a linha atual para o arquivo cujo nome está em f .
Eu acredito que você pode acabar com a variável f e usar a expressão substr() diretamente após > , mas não na implementação awk que estou usando no OpenBSD (isso é possivelmente um bug) .
Se o número de combinações diferentes de dois primeiros caracteres for muito, você poderá ter problemas com muitos arquivos abertos.
A seguinte variação cuidará disso:
awk '{ f = substr($0,1,2) ".txt"; print >>f; close(f) }' file.in