2014-06-11 32 views
0

行,我有以下文件:AWK - 剝離出來的DDL

CREATE TABLE "DB2INST1 "."EMAIL_ADDRESS" (
        "EMAIL_ADDRESS_ID" INTEGER NOT NULL , 
        "PERSON_ID" INTEGER , 
        "EMAIL_ADDRESS" VARCHAR(128) NOT NULL , 
        "CC_ADDRESS" VARCHAR(128) , 
        "UPPER_EMAIL_ADDRESS" VARCHAR(128) GENERATED ALWAYS AS (UPPER(EMAIL_ADDRESS)) , 
       IN "USERSPACE5" INDEX IN "IDXSPACE5" LONG IN "LONGSPCE1" ; 


CREATE TABLE "DB2INST "."FIELD_RESPONSE" (
        "FIELD_RESPONSE_ID" INTEGER NOT NULL , 
        "CUSTOM_FIELD_ID" INTEGER , 
        "NAME" VARCHAR(100) NOT NULL , 
        "RESPONSE" VARCHAR(100) , 
        "RESPONSE_LONG" CLOB(256000) LOGGED NOT COMPACT , 
        "FIELD_RESPONSE_100" VARCHAR(100) GENERATED ALWAYS AS (case when RESPONSE is null or RESPONSE = '' then cast(RESPONSE_LONG as varchar(100)) else RESPONSE end) , 
       COMPRESS YES 
       DATA CAPTURE CHANGES 
       IN "USERSPACE1" INDEX IN "IDXSPACE1" LONG IN "LONGSPCE1" ; 

我可以使用下面的AWK命令剝離出每個這些記錄了DDL的:

awk '/^CREATE TABLE/ {print}' FS="\n" RS="" <src.ddl> tables.ddl 

現在,我正嘗試刪除GENERATED ALWAYS以及之後的所有內容。我想這個文件,看起來像這樣(END RESULT):

CREATE TABLE "DB2INST1 "."EMAIL_ADDRESS" (
        "EMAIL_ADDRESS_ID" INTEGER NOT NULL , 
        "PERSON_ID" INTEGER , 
        "EMAIL_ADDRESS" VARCHAR(128) NOT NULL , 
        "CC_ADDRESS" VARCHAR(128) , 
        "UPPER_EMAIL_ADDRESS" VARCHAR(128) , 
       IN "USERSPACE5" INDEX IN "IDXSPACE5" LONG IN "LONGSPCE1" ; 


CREATE TABLE "DB2INST "."FIELD_RESPONSE" (
        "FIELD_RESPONSE_ID" INTEGER NOT NULL , 
        "CUSTOM_FIELD_ID" INTEGER , 
        "NAME" VARCHAR(100) NOT NULL , 
        "RESPONSE" VARCHAR(100) , 
        "RESPONSE_LONG" CLOB(256000) LOGGED NOT COMPACT , 
        "FIELD_RESPONSE_100" VARCHAR(100) , 
       COMPRESS YES 
       DATA CAPTURE CHANGES 
       IN "USERSPACE1" INDEX IN "IDXSPACE1" LONG IN "LONGSPCE1" ; 

我試圖在

|awk '{print $1 " " $2 ", " }' < tables.ddl ... 

但是使用這種AWK,只打印出兩列數據。

有什麼建議嗎?

回答

2

sed可以成爲一個很好的工具:

sed 's/GENERATED ALWAYS AS.*$/,/' file 

該得到的一切,從GENERATED ALWAYS AS達線的末端,並用逗號替換它。

如果您想進行就地編輯,請使用-i。它將創建一個file.bak與當前內容和file將包含新版本。

sed -i.bak 's/GENERATED ALWAYS AS.*$/,/' file 
+0

這解決方案非常接近。但是,它不保留列名,數據類型和逗號。 – BennyMinVA

+0

你是什麼意思?它會得到''UPPER_EMAIL_ADDRESS'VARCHAR(128)GENERATED ALWAYS AS(UPPER(EMAIL_ADDRESS)),'並返回''UPPER_EMAIL_ADDRESS「VARCHAR(128),',就像你在問題中所問的那樣......我認爲這是需求,不是嗎? – fedorqui

+1

這是美麗的工作!!!!!!!! – BennyMinVA

0

少許修改你的代碼:使用gensub ...

awk '/^CREATE TABLE/ {print gensub(/GENERATED ALWAYS .*\n/,",\n","g") "\n";}' FS="\n" RS="" src.ddl > tables.ddl 
+0

不幸的是,這不適用於我的主文件。我會在幾個小時後發佈更大的文件... – BennyMinVA

0

你可以這樣說:

awk 'BEGIN{FS="\n"; RS=""}/^CREATE TABLE/{sub(/GENERATED ALWAYS.*,/, ","); print}' src.ddl > tables.ddl 

Excpected輸出:

CREATE TABLE "DB2INST1 "."EMAIL_ADDRESS" (
        "EMAIL_ADDRESS_ID" INTEGER NOT NULL , 
        "PERSON_ID" INTEGER , 
        "EMAIL_ADDRESS" VARCHAR(128) NOT NULL , 
        "CC_ADDRESS" VARCHAR(128) , 
        "UPPER_EMAIL_ADDRESS" VARCHAR(128) , 
       IN "USERSPACE5" INDEX IN "IDXSPACE5" LONG IN "LONGSPCE1" ; 
CREATE TABLE "DB2INST "."FIELD_RESPONSE" (
        "FIELD_RESPONSE_ID" INTEGER NOT NULL , 
        "CUSTOM_FIELD_ID" INTEGER , 
        "NAME" VARCHAR(100) NOT NULL , 
        "RESPONSE" VARCHAR(100) , 
        "RESPONSE_LONG" CLOB(256000) LOGGED NOT COMPACT , 
        "FIELD_RESPONSE_100" VARCHAR(100) , 
       COMPRESS YES 
       DATA CAPTURE CHANGES 
       IN "USERSPACE1" INDEX IN "IDXSPACE1" LONG IN "LONGSPCE1" ; 
+1

@fedorqui是的,先注意到它,但忘記了我最後的編輯。不知何故,我也只是不想觸摸它,但確定我會編輯。 – konsolebox

+0

不幸的是,這不適用於我的主文件。我會在幾個小時後發佈更大的文件... – BennyMinVA