Dividir um arquivo com base na string necessária

1

Eu tenho um arquivo de teste com o conteúdo abaixo:

CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);

Agora, quero dividir este arquivo único de teste em dois arquivos: um arquivo com CREATE declaração até ; como file1 e o outro arquivo como file2 com REPLACE declaração até ; . / p>

Você pode me ajudar com como dividir isso, por favor?

    
por hari 02.02.2016 / 10:58

3 respostas

2

Aqui está uma maneira com sed :

sed -n 'H                      # append every line to hold buffer
/CREATE\|REPLACE/h             # if CREATE or REPLACE, overwrite hold buffer
/;/{                           # if line matches ; then
x                              # exchange hold space w. pattern space
/CREATE/w file1                # if pattern space matches CREATE, write to file1
/REPLACE/w file2               # if it matches REPLACE, write it to file2
}
' infile
    
por 02.02.2016 / 12:24
1

Experimente este script awk :

/CREATE/{
b="";
    while (match($0, ";$")==0)
    {
        b=b $0"\n";
        getline;

    }
    b=b $0;
    print b > "file1";
}

/REPLACE/{
c="";
    while (match($0, ";$")==0)
    {
        c=c $0"\n";
        getline;

    }
    c=c $0;
    print c > "file2";
}

Então

awk -f some.awk inputFile

produz:

cat file1
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);

e

cat file2
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
    
por 03.02.2016 / 12:45
1
sed -e '/CREATE/,/;/s/^//w file1' -e//d <infile >file2

... isso apenas nega o alcance. Ele grava todas as linhas dentro da extensão CREATE ... ; para o arquivo1 e todas as outras para o arquivo2.

Mais simplesmente, talvez:

sed -ne '/CREATE/,/;/w file1' -e '/REPLACE/,/;/w file2' <infile

... embora isso possa se sobrepor se a sua entrada real não for tão cortada e seca quanto os seus dados de exemplo.

Com seus dados de exemplo, no entanto, posso executar o comando e depois fazer:

head -n50 file[12]

... para produzir a seguinte saída:

==> file1 <==
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);

==> file2 <==
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
    
por 04.02.2016 / 18:28