dividindo o arquivo com base nos valores da coluna específica

1

Eu tenho um arquivo que gostaria de dividir em vários arquivos com valores uniq para a primeira coluna. Por exemplo, aqui está um arquivo:

fileA.txt

1    Cat
1    Dog
1    Frog
2    Boy
2    Girl
3    Tree
3    Leaf
3    Branch
3    Trunk

Gostaria que minha saída fosse algo como isto:

arquivo1.txt

1    Cat
2    Boy
3    Tree

arquivo2.txt

1    Dog
2    Girl
3    Leaf

file3.txt

1    Frog
3    Branch

file4.txt

3    Trunk

Se um valor não existir, eu quero que ele seja ignorado. Eu tentei procurar por situações semelhantes às minhas, mas acabei por faltar. Alguém tem ideia de como fazer isso?

Editar: Minha versão do awk é: awk version 20070501

    
por cosmictypist 02.02.2016 / 16:40

1 resposta

2
$ 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.

    
por 02.02.2016 / 16:49