$ 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