0

何百万もの SQL ステートメントを含むファイルが Unix にあります。現在、それらのいくつかは複数の行に分割されています。明らかに、処理のためにsedまたはawkなどを使用して、それらを1行に結合したいと考えています。

例:

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

また

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

ファイルには、次のような SQL set ステートメントも含めることができます。

set term off;   

そのような行で何もする必要はありません。

したがって、基本的には、「INSERT」または「UPDATE」または「DELETE」で始まる行を見つけて、複数行の次のセミコロンを検索し、そのような行を結合して 1 行にする必要があります。awk/sed/perl で実現できますか?

4

2 に答える 2

3

との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
于 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 に答える