0

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

例子:

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

或者

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

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

set term off;   

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

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

4

2 回答 2

3

一种方法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
于 2013-05-16T10:44:12.953 回答
0

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

实验

[[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');
于 2013-05-16T10:57:27.187 回答