根据所需字符串拆分文件

根据所需字符串拆分文件

我有包含以下内容的测试文件:

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 个文件:一个文件包含CREATE声明ill ; as ,file1另一个文件asfile2包含REPLACE声明till ;

你能帮我看看如何分割这个吗?

答案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

...尽管如果您的实际输入不像示例数据那么简单,那么这一点可能会重叠。

但是,使用您的示例数据,我可以运行任一命令,然后执行以下操作:

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

相关内容