Imprime todas as linhas entre um padrão pesquisado de um arquivo de texto para um arquivo diferente

3

Eu tenho um arquivo chamado test.txt que contém:

....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl

Eu quero que todas as linhas entre dois padrões de "Solicitação" sejam impressas em um arquivo -2 diferente como:

arquivo1:

asaksa
sda
dsad
dsad

arquivo2:

21mklk
nnm212
mkmr543
849238

arquivo3:

4392840
kndska
94i0-jkfjdk
smdla

arquivo4:

839281
ksndlka
nsc
mcxmzl

como sábio

    
por sachin sharma 06.08.2014 / 14:50

3 respostas

2

Que tal apenas incrementar um contador de arquivos cada vez que você encontrar a string Request ?

awk '/Request/ {n++; next}; {print > "file"n}' test.txt
    
por 06.08.2014 / 15:13
1
csplit -f file -z --suppress-matched - '/Request/' '{*}' <<\DATA
....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl
DATA

Você está perguntando como usar csplit , basicamente. Sua tarefa é dividir seu arquivo de entrada em arquivos separados com base em correspondências de contexto.

ls 

file00  file01  file02  file03

cat file00

asaksa
sda
dsad
dsad

cat file*

asaksa
sda
dsad
dsad
21mklk
nnm212
mkmr543
849238
4392840
kndska
94i0-jkfjdk
smdla
839281
ksndlka
nsc
mcxmzl
    
por 06.08.2014 / 18:52
0

Ou use a variável incorporada NR para o número de registro:

awk -v RS='\.+Request\.+'  '{if (NR==1) next}  {print > "file"NR-1 }' test.txt

e não cria um arquivo vazio para file1 .

Este um pouco mais longo remove a linha vazia no início e no final de cada arquivo de saída:

awk -v RS='\.+Request\.+' -v ORS= '{if (NR==1) next}  { gsub("^\n",""); print > "file"NR-1 }' test.txt
    
por 06.08.2014 / 15:42