extrai o conteúdo do arquivo para vários arquivos com base no padrão de correspondência

1

Eu sou novo no unix. Eu gostaria de processar este arquivo.

PP_NAME_1
jprovider|J Driver Provider|${J_DRIVER_PATH}/jcc;${J_DRIVER_PATH}/jcc_license_cu|${J_DRIVER_NATIVEPATH}|com.jcc.Connection
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_ias|chuchchu|password|CHCHCH|4|serverName|portNumber
save
PP_NAME_2
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
save
PP_NAME_3
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
Alias|461bdhk_host|123.45.67.89|10000
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_s|chuchchu|password|CHCHCH|4|serverName|portNumber
Variable|J_DRIVER_PATH|
save
PP_NAME_4
classPath|/mm/ja/lib
Variable|J_DRIVER_PATH|
save

Gostaria de extrair linhas ao lado do padrão de correspondência PP_NAME_1 para salvar primeiro o padrão em FILE1

Em seguida, as linhas ao lado de combinar o padrão PP_NAME_2 com o segundo padrão de salvamento em FILE2 e assim por diante.

Não haverá linhas vazias no arquivo original.

U irá observar as linhas variam para cada arquivo.

FILE1 terá 3 linhas

FILE2 terá 5 linhas

FILE3 terá 8 linhas

e

FILE4 terá 3 linhas.

Assim, as linhas variam de hora em hora, pode haver mais de 50 linhas.

    
por user2692634 17.05.2014 / 17:55

1 resposta

0

Use awk com PP_NAME_ como o separador de registro:

awk -v RS='PP_NAME_' -v FS='\n' '/./ {print | "tail -n +2 >FILE"$1}' input

awk lê em um "registro" de cada vez e divide cada registro em "campos". Nesse caso, o uso RS='PP_NAME_' define um registro como todo o texto até a próxima instância dos caracteres PP_NAME_ . O separador de campo, FS , é igual a uma nova linha. Isso significa que cada linha é um "campo". Definido desta forma, cada registro começa com uma linha contendo o número do arquivo no qual queremos gravar o registro. A gravação real do registro no arquivo é feita com: print | "tail -n +2 >FILE"$1 . Como $1 é o número que permanece na primeira linha, "FILE"$1 é o nome do arquivo de saída que queremos gravar. Queremos escrever tudo no registro para aquele arquivo exceto para a primeira linha que possui o número. O uso do comando shell tail -n +2 remove a primeira linha.

O primeiro registro lido é todo o texto antes da primeira ocorrência de PP_NAME_ . Isso significa que o primeiro registro lido está vazio. Como não queremos escrever isso, a expressão regular /./ é colocada antes do comando print . Essa regex corresponde a qualquer registro não vazio. Isso significa que elimina o registro vazio que não queríamos.

    
por 17.05.2014 / 22:58