입력의 첫 번째 줄에 있으면 첫 번째 일치, 그렇다면 전체 줄을 인쇄하고, 그렇지 않으면 첫 번째 단어 뒤에 쉼표를 인쇄합니다.

입력의 첫 번째 줄에 있으면 첫 번째 일치, 그렇다면 전체 줄을 인쇄하고, 그렇지 않으면 첫 번째 단어 뒤에 쉼표를 인쇄합니다.

예를 들어:

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

관련 정보