$ gawk '{print > "file" ++a[$1] ".txt"}' input
# And on OSX awk, and also gawk:
$ awk '{print > ("file" ++a[$1] ".txt")}' input
$ head file*txt
==> file1.txt <==
1 Cat
2 Boy
3 Tree
==> file2.txt <==
1 Dog
2 Girl
3 Leaf
==> file3.txt <==
1 Frog
3 Branch
==> file4.txt <==
3 Trunk
editar : Uma explicação.
Isso imprime a linha atual em ( >
) fileX.txt
. Toda vez que o primeiro campo é encontrado, um array a[$1]
é aumentado em 1 antes de ser avaliado. Isso é usado para estabelecer o nome do arquivo.
edite 2 :
Eu não tenho a possibilidade de verificar com o awk do OSX, mas eu acho que se você é um pouco sério sobre o uso do awk, você faria uma boa instalação gawk
ou mawk
. Você poderia, no entanto, dar uma chance a isso:
$ awk '{a[$1]++; f = "file" a[$1] ".txt"; print > f}' input
Isso faz o mesmo, mas toda a ação é dividida em etapas separadas. Isso é para ajudar o OSX a entender a ordem correta de avaliar as partes.