目的の文字列に基づいてファイルを分割する

目的の文字列に基づいてファイルを分割する

次の内容を含むテストファイルがあります。

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
);

これで、このテスト単一のファイルを2つのファイルに分割したいと思います。あるファイルにはill asCREATEステートメントが含まれ、他のファイルにはtilステートメントが含まれています。;file1file2REPLACE;

これを分割する方法を教えてください。

答え1

方法は次のとおりです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

答え2

次の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";
}

だから

awk -f some.awk inputFile

生産する:

猫ファイル1
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);

そして

猫ファイル2
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);

答え3

sed -e '/CREATE/,/;/s/^//w file1' -e//d <infile >file2

...ただ範囲を無効にするだけです。すべての行を書き込みます。CREATE ... ;範囲は file1 で、他のすべての範囲は file2 です。

もっと簡単に言えば、

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

...実際の入力がサンプルデータほど単純ではない場合、重複する可能性があります。

ただし、サンプルデータを使用して2つのコマンドのいずれかを実行し、次のことを実行できます。

head -n50 file[12]

...次のような出力が生成されます。

==> 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
);

関連情報