【问题标题】:Join Broken SQL statements加入损坏的 SQL 语句
【发布时间】:2013-05-11 05:04:38
【问题描述】:

我在 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 中实现吗?

【问题讨论】:

  • 显然我希望它们合并成一行”。对我来说,这并不明显。

标签: sql perl parsing sed awk


【解决方案1】:

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

【讨论】:

  • 不错的尝试,我印象深刻,但 cmets 会产生问题:code$ cat file.sql --COMMENT SET DEFINE OFF;插入 EMP (EMP,ENAME) 值 ('1', 'John'); UPDATE EMP SET ENAME='Samantha' WHERE DEPT=20;设定期限; $ awk '{printf "%s",$0}/;$/{print ""}' file.sql --COMMENTSET DEFINE OFF;插入 EMP(EMP,ENAME)VALUES('1', 'John');更新 EMP SETENAME='Samantha' WHEREDEPT=20;设置期限;code
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 2020-01-14
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多