加入Broken SQL语句

时间:2013-05-16 10:35:07

标签: sql perl parsing sed awk

我在Unix中有一个拥有数百万条SQL语句的文件。 现在其中一些被分成多行。显然,我希望它们使用sed或awk或任何其他方法组合成一行。

示例:

INSERT INTO EMP
(EMP,ENAME)
VALUES
('1', 'John');

UPDATE EMP SET
ENAME='Samantha' WHERE
DEPT=20;

现在该文件还可以包含SQL set语句,如:

set term off;   

我们不需要对这些行做任何事情。

所以基本上我们需要找到以'INSERT'或'UPDATE'或'DELETE'开头的行,然后开始在多行中搜索下一个分号并连接这些行以形成一行。我们可以在awk / sed / perl中实现吗?

2 个答案:

答案 0 :(得分:2)

使用awk

的一种方法
awk '{printf "%s",$0}/;$/{print ""}' file

<强>演示:

$ cat file
INSERT INTO EMP
(EMP,ENAME)
VALUES
('1', 'John');
UPDATE EMP SET
ENAME='Samantha' WHERE
DEPT=20;
set 
term 
off;

$ awk '{printf "%s",$0}/;$/{print ""}' file
INSERT INTO EMP(EMP,ENAME)VALUES('1', 'John');
UPDATE EMP SETENAME='Samantha' WHEREDEPT=20;
set term off;

使用重定向将更改存储到新文件:

$ awk '{printf "%s",$0}/;$/{print ""}' file > newfile

答案 1 :(得分:0)

awk '/^INSERT|^UPDATE|^DELETE/{i=1} /;/{i=0} {printf("%s ",$0);if(!i) print""}' <filename> 这将找到关键字然后设置一个标志,只有在找到;时才会重置。现在,直到标志设置,将不会打印换行符。因此,如果;出现在同一行,如果有任何其他单词没有;,那么它会照顾

实验

[[bash_prompt$]]$ cat log
INSERT INTO EMP;
(EMP,ENAME)
VALUES
('1', 'John');
set term off;
UPDATE EMP SET
ENAME='Samantha' WHERE
DEPT=20;
INSERT INTO EMP
(EMP,ENAME)
VALUES
('1', 'John');
[[bash_prompt$]]$ awk '/^INSERT|^UPDATE|^DELETE/{i=1} /;/{i=0} \
{printf("%s ",$0);if(!i) print""}' log
INSERT INTO EMP;
(EMP,ENAME)
VALUES
('1', 'John');
set term off;
UPDATE EMP SET ENAME='Samantha' WHERE DEPT=20;
INSERT INTO EMP (EMP,ENAME) VALUES ('1', 'John');