예를 들어:
CREATE TABLE MWWDATA.ACK997 (
AKTYPE CHAR(2) DEFAULT '' NOT NULL ,
AKNUM CHAR(9) DEFAULT '' NOT NULL );
CREATE TABLE MWWDATA.APREIDEXC (
EMPLID NUMBER(15, 0) DEFAULT NULL );
나는 다음과 같은 출력을 원합니다 :
CREATE TABLE MWWDATA.ACK997(AKTYPE,ANUM);
CREATE TABLE MWWDATA.APREIDEXC(EMPLID);
답변1
그만큼sed방법
처럼sed대부분의 대안보다 훨씬 가볍습니다. 또 다른 해결책이 있습니다
sed -ne '
/CREATE/{h;d};
s/^ *\([^ ]\+\) .*\()\);\? *$/\1\2/;
ta;
s/^ *\([^ ]\+\) .*$/\1/;
H;
bb;
:a;
H;
x;
s/\n//;
s/\n/,/g;
s/ (/(/;p ;
:b'
이것은 다음과 같이 작성할 수 있습니다.
sed -ne '/CREATE/{h;d};s/^ *\([^ ]\+\) .*\()\);\? *$/\1\2/;ta;
s/^ *\([^ ]\+\) .*$/\1/;H;bb;:a;H;x;s/\n//;s/\n/,/g;s/ (/(/;p ;:b'
그러면 샘플이 렌더링됩니다.
CREATE TABLE MWWDATA.ACK997(AKTYPE,AKNUM)
CREATE TABLE MWWDATA.APREIDEXC(EMPLID)
답변2
이 perl
스크립트
\n
일치하는 경우 전체 줄( 없이)을 인쇄합니다./^CREATE TABLE/
- 그 뒤에 오는 첫 번째 단어
);
와 줄이 다음으로 끝나는 경우 개행 문자;
,
줄이 a로 끝나는 경우 첫 번째 단어 뒤에 a가 옵니다,
.- 다른 모든 입력 라인은 무시됩니다.
#! /usr/bin/perl
use strict;
while(<>) {
chomp;
if (m/^CREATE TABLE/) {
print $_;
} else {
my @line=split ;
if (/;\s*$/) {
print "$line[0]);\n";
} elsif (m/,\s*$/) {
print "$line[0],";
}
}
}
스크립트의 출력은 요청한 내용과 일치합니다.
$ ./summarise.pl table.sql
CREATE TABLE MWWDATA.ACK997 (AKTYPE,AKNUM);
CREATE TABLE MWWDATA.APREIDEXC (EMPLID);