例えば:
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/
- 最初の単語に続いて
);
改行が続く場合は、行末に;
,
行が で終わる場合は、最初の単語の後に が続きます,
。- その他の入力行はすべて無視されます。
#! /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);