Crie pequenos arquivos de registro de um grande grupo de arquivos de registro

2

Eu tenho um arquivo como este:

Mainfile:

Record|1111|ABC     
text in between for record 1     
text in between for record 1     
Record|2222|XYZ     
text in between for record 2     
Record|3333|XYZ     
text in between for record 3 

Eu quero criar arquivos menores que contenham cada registro de dados

Arquivo: 1111

Record|1111|ABC    
text in between for record 1    
text in between for record 1

Arquivo: 2222

Record|2222|XYZ
text in between for record 2

Arquivo: 3333

Record|3333|XYZ
text in between for record 3

Atualmente estou usando o awk para fazer isso:

awk -F"|" '
/Record/{ 
        if(s>0) {
             print line > r;
         }
s=1; 
r=$2; 
line=$0 
} 
!/Record/
{ 
line=line"\n"$0; 
}

END
{
    print line > r;
}' file

Mas leva mais tempo para processar o arquivo. Cada arquivo tem tamanho de 4 GB e contém cerca de 75k + registros.

Existe alguma maneira mais rápida de fazer isso?

    
por Sinoop Joy 05.12.2014 / 10:41

2 respostas

2

Usando o GNU awk, você pode tentar:

gawk -v RS='Record[|]' -F'|' '$1{printf "%s%s", RT, $0 > $1}' file

Com Record| como o separador de registros , podemos obter facilmente cada registro . O RS do GNU awk pode ser uma expressão regular (como neste caso), e RT contém o texto que corresponde a essa expressão ( Record| ).

Com mawk , RT não está disponível, então você pode usar printf "Record|%s", $0 .

    
por 05.12.2014 / 11:14
2

Agora, se for necessário remover os nomes dos arquivos de saída no conteúdo do arquivo, coreutils csplit pode ser mais rápido que awk

csplit file '/^Record[|]/' '{*}'

Isso criará um conjunto de arquivos xx01 , xx02 e assim por diante. Você pode ignorar o arquivo xx01 , pois no seu caso ele estará vazio. Observe também que csplit permite configurar o prefixo ( xx ) e o sufixo ( 01 , 02 ....) partes dos nomes dos arquivos de saída

    
por 05.12.2014 / 17:05