Erste Übereinstimmung, wenn wir uns in der ersten Eingabezeile befinden. Wenn ja, drucken Sie die ganze Zeile, andernfalls drucken Sie das erste Wort, gefolgt von einem Komma.

Erste Übereinstimmung, wenn wir uns in der ersten Eingabezeile befinden. Wenn ja, drucken Sie die ganze Zeile, andernfalls drucken Sie das erste Wort, gefolgt von einem Komma.

zum Beispiel:

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

Ich möchte eine Ausgabe wie:

CREATE TABLE MWWDATA.ACK997(AKTYPE,ANUM);
CREATE TABLE MWWDATA.APREIDEXC(EMPLID);

Antwort1

DerWeg

Alsist viel leichter als die meisten Alternativen, es gibt eine andere Lösung

sed -ne '
    /CREATE/{h;d};
    s/^ *\([^ ]\+\) .*\()\);\? *$/\1\2/;
    ta;
    s/^ *\([^ ]\+\) .*$/\1/;
    H;
    bb;
   :a;
    H;
    x;
    s/\n//;
    s/\n/,/g;
    s/ (/(/;p ;
   :b'

Dies könnte geschrieben werden:

sed -ne '/CREATE/{h;d};s/^ *\([^ ]\+\) .*\()\);\? *$/\1\2/;ta;
    s/^ *\([^ ]\+\) .*$/\1/;H;bb;:a;H;x;s/\n//;s/\n/,/g;s/ (/(/;p ;:b'

Dies wird aus Ihrem Beispiel rendern

CREATE TABLE MWWDATA.ACK997(AKTYPE,AKNUM)
CREATE TABLE MWWDATA.APREIDEXC(EMPLID)

Antwort2

Dieses perlSkript

  • druckt die vollständige Zeile (ohne \n), wenn sie übereinstimmt/^CREATE TABLE/
  • das erste Wort, gefolgt von );und einem Zeilenumbruch, wenn die Zeile mit endet;
  • und das erste Wort gefolgt von einem, ,wenn die Zeile mit einem endet ,.
  • Alle anderen Eingabezeilen werden ignoriert.
#! /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],";
        }
   }
}

Die Ausgabe des Skripts entspricht Ihrer Anfrage:

$ ./summarise.pl table.sql 
CREATE TABLE MWWDATA.ACK997 (AKTYPE,AKNUM);
CREATE TABLE MWWDATA.APREIDEXC (EMPLID);

verwandte Informationen