我有包含以下内容的测试文件:
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
);