我在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中实现吗?
答案 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');