Dividir o arquivo em arquivos separados usando o padrão

4

Eu preciso dividir um arquivo (ver exemplo) em arquivos separados. Cada novo arquivo deve herdar o nome na linha 7, ou seja, SAMPLE1.txt , SAMPLE2.txt etc.

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE1
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE2
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD

@File_Version: 4
@Coordinate_Type_is: 1
@Export_Type_is: 1
@Number_of_P: 1
@T_Type_Name: , 
#File_Version____________-> 4
#Name____________-> SAMPLE3
#Type____________-> 3

#End_of_file_header
    000000.00000    0000000.00000   0000.00000
    000000.00000    0000000.00000   0000.00000
...
EOD
    
por akura 19.09.2016 / 13:37

2 respostas

3

Você pode fazer isso com awk :

awk '{
        if(/@File_Version:/){k=$0;}
        else{k=k"\n"$0}
     } 
    /^#Name/{n=$2}
    /EOD/{
        print k > n".txt"; 
    }' file 

Explicação

  • if(/^@File_Version:/){k=$0;} : se esta linha começar com @File_Version: , salve a linha como k .
  • else{k=k"\n"$0} : para todas as outras linhas, adicione uma nova linha ( \n ) seguida da linha atual ao valor atual de k .
  • /^#Name/{n=$2} : se esta linha começar com #Name , defina a variável n para o segundo campo (o nome).
  • /^EOD/{print k > n".txt";} : se essa linha começar com EOD , imprima a variável k (que agora contém o registro inteiro) em um arquivo chamado n.txt , em que n é o nome salvo na etapa anterior.
por 19.09.2016 / 14:01
1
awk '/#Name/{ x=$NF;  }; /#End_of_file_header/,/EOD/{ print > x} '  test1

Se a linha começar por #name , x armazene a última palavra da linha. Então, para todos os blocos delimitados por #End_of_file_header e EOD i, imprima as linhas em um arquivo cujo nome é conteúdo de x

Este pulará o cabeçalho do arquivo para armazenar apenas dados no arquivo.

    
por 19.09.2016 / 14:37