2013-05-16 7 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 --COM SET 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) ЗНАЧЕНИЯ ('1', 'John'); UPDATE EMP SETENAME = 'Саманта' WHEREDEPT = 20; set term off; 'code' – contravaluebets

+0

Вы не смогли пренебречь этой точкой в ​​своем вопросе так ** очевидно ** Я не мог включить в ответы. Этот дамп данных имеет нулевое форматирование, пожалуйста, добавьте его в правильно отформатированный вопрос и покажите результат ожидания. –

0

awk '/^INSERT|^UPDATE|^DELETE/{i=1} /;/{i=0} {printf("%s ",$0);if(!i) print""}' <filename> это найти т he Ключевые слова, а затем установить флаг, который будет сброшен только тогда, когда будет найден ;. Теперь, пока флаг не установлен, новая строка не будет напечатана. Так он будет заботиться, если ; присутствует в той же строке, если какие-либо другие слова, там без ;, это не будет касаться того

Эксперимента

[[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'); 
Смежные вопросы