2013-05-16 50 views
0

我在Unix中有一個文件,它有數百萬條SQL語句。 現在其中一些被分成多行。很顯然,我希望他們能夠使用sed或awk或其他任何方法來處理單個行。加入破損的SQL語句

例子:

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中實現嗎?

+3

「*顯然*我希望他們結合一條線「。對我而言,這並不明顯。 –

回答

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; 

使用重定向存儲更改爲的newfile:

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

不錯的嘗試和我留下深刻的印象,但評論會產生一個問題:'code' $ cat file.sql --COMMENT SET DEFINE OFF; INSERT INTO EMP(EMP,ENAME)VALUES('1','John'); UPDATE EMP SET ENAME ='Samantha'WHERE DEPT = 20;設定任期; $ awk'{printf「%s」,$ 0} /; $/{print「」}'file.sql --COMMENTSET DEFINE OFF; INSERT INTO EMP(EMP,ENAME)VALUES('1','John'); UPDATE EMP SETENAME ='Samantha'WHEREDEPT = 20; set term off;'code' – contravaluebets

+0

你沒有在你的問題中忽略這一點,所以**顯然**我不能包含在答案中。該數據轉儲具有零格式,請將其添加到格式正確的問題並顯示期望輸出。 –

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