imprimindo caracteres especiais na saída awk

2

Eu tenho um arquivo grande que contém muitas mensagens MQ com o cabeçalho RFH2. Cada mensagem no arquivo é separada por uma linha em branco. Agora eu preciso dividir este grande arquivo em pequenos arquivos, cada um contendo uma única mensagem com o cabeçalho RFH2.

Eu tentei com o comando awk abaixo

awk '{RS=""} {print $0}' inputfile

Imprime a primeira linha sem os caracteres de controle, o que não é útil. A primeira linha de cabeçalho do RFQ MQ começa como RFH ^B^C^X^A^Q^C3MQSTR ^D¸ seguida pelos dados da mensagem. A saída do awk imprime apenas o texto RFH . Se o arquivo de entrada tiver 50 mensagens depois de executar este comando, recebo 50 arquivos com apenas o texto RFH . Estou esperando 50 arquivos com cabeçalho e dados RFH2.

Não consegui fornecer a entrada real do arquivo porque ele contém dados confidenciais. O arquivo começa com

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
.........some text of many lines.....

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
........some text of many lines.....

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
...

E os arquivos de saída devem ter

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
.........some text of many lines
    
por Raj 11.06.2014 / 12:20

2 respostas

2

Aqui vai você. Entrada (testfile):

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....

RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....

Código:

awk '{print $0 > "file" NR}' RS='\n\n' testfile

Substitua "arquivo" pelo nome dos arquivos que você deseja ter. Com este exemplo, você terá:

$ cat file1
RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....

$ cat file2
RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....

$ cat file3
RFH ^B^C^X^A^Q^C3MQSTR ^D¸X<jms>
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
.........some text of many lines.....
    
por 12.06.2014 / 12:20
1

Isso está perto:

awk '{RS=""} {print $0}' inputfile

No entanto, você precisa definir a variável RS antes de o awk começar a ler o arquivo. Escolha um destes:

awk 'BEGIN {RS=""} {print}' inputfile
awk -v RS="" '{print}' inputfile

Para ver os caracteres de controle, canalize a saída do awk para cat -v

awk -v RS="" 1 inputfile | cat -v
    
por 11.06.2014 / 16:49