如果我們在輸入的第一行,則首先匹配,如果是,則列印整行,否則列印第一個單詞,後面跟著逗號

如果我們在輸入的第一行,則首先匹配,如果是,則列印整行,否則列印第一個單詞,後面跟著逗號

例如:

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

相關內容