2013-02-11 49 views
1

我有一個DDL命令與300加字段,我需要分開的字段和數據類型,並將它們存儲到Excel電子表格。有些數據類型之間有空格。這裏是我的示例數據如下。分割數據在unix

我已經試過

cut -f2 sample.txt | grep -e "^$" -v > sample1.txt 
cut -f1 -d" " sample1.txt > fields.txt 

我能夠從輸入文件中獲取COLUMN1但我怎麼分開,並沒有得到字段的數據類型NULL約束separately.Also如果沒有NOT NULL約束輸出文件應該有NULL值。

INPUT

SUPPLIER_PROC_ID BIGINT NOT NULL 
BTCH_NBR INTEGER NOT NULL 
RX_BTCH_SUPPLIER_SEQ_NBR INTEGER NOT NULL 
CORRN_ID INTEGER NOT NULL 
RX_CNT BYTEINT NOT NULL 
DATA_TYP_CD BYTEINT NOT NULL 
DATA_PD_CD BYTEINT NOT NULL 
CYC_DT DATE NOT NULL 
BASE_DT DATE NOT NULL 
DATA_LOAD_DT DATE NOT NULL 
DATA_DT DATE NOT NULL 
SUPPLIER_DATA_SRC_CD BYTEINT NOT NULL 
RX_CHNL_CD BYTEINT NOT NULL 
MP_IMS_ID INTEGER NOT NULL 
MP_LOC_ID NUMERIC(30) 
MP_IMS_ID_ACTN_CD BYTEINT NOT NULL 
NPI_ID BIGINT 
NPI_ID_ACTN_CD BYTEINT NOT NULL 
MP_DEA_NBR NATIONAL CHARACTER VARYING(9) 
MP_DEA_NBR_ACTN_CD BYTEINT NOT NULL 

OUTPUT

字段

SUPPLIER_PROC_ID 
BTCH_NBR 
RX_BTCH_SUPPLIER_SEQ_NBR 
CORRN_ID 
RX_CNT 
DATA_TYP_CD 
DATA_PD_CD 
CYC_DT 
BASE_DT 
DATA_LOAD_DT 
DATA_DT 
SUPPLIER_DATA_SRC_CD 
RX_CHNL_CD 
MP_IMS_ID 
MP_LOC_ID 
MP_IMS_ID_ACTN_CD 
NPI_ID 
NPI_ID_ACTN_CD 
MP_DEA_NBR 
MP_DEA_NBR_ACTN_CD 

數據類型

BIGINT 
INTEGER 
INTEGER 
INTEGER 
BYTEINT 
BYTEINT 
BYTEINT 
DATE 
DATE 
DATE 
DATE 
BYTEINT 
BYTEINT 
INTEGER 
NUMERIC(30) 
BYTEINT 
BIGINT 
BYTEINT 
NATIONAL CHARACTER VARYING(9) 
BYTEINT 

不收空

NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 
NOT NULL 

NOT NULL 

NOT NULL 

NOT NULL 
+0

你試過了什麼,或者你想讓別人來做你的工作? – Fusselchen 2013-02-11 20:18:21

+0

嗨,我添加了代碼。 – Teja 2013-02-11 20:37:22

+0

您在輸出列表中缺少「NOT NULL」。 – Thor 2013-02-11 21:35:42

回答

2

這是一個有點棘手解決。您可以通過尋找 「NULL」 因此做在每行的結束和處理輸入:

parse.awk

$NF == "NULL" { null_flag = 1 } 
{ 
    # first column goes to "fields" 
    print $1 > "fields" 

    # second column through NF or NF-2 goes to "data-types" 
    for(i=2; i <= NF-(null_flag ? 2: 0); i++) 
    printf "%s ", $i > "data-types" 
    printf "\n" > "data-types" 

    # "NOT NULL" or "" goes to "not-nulls" based on the null_flag 
    print (null_flag ? "NOT NULL": "") > "not-nulls" 
} 
{ null_flag = 0 } 

運行這樣的:

awk -f parse.awk infile 

輸出:

fields     data-types      not-nulls 
~~~~~~     ~~~~~~~~~~      ~~~~~~~~~ 
SUPPLIER_PROC_ID   BIGINT       NOT NULL 
BTCH_NBR     INTEGER       NOT NULL 
RX_BTCH_SUPPLIER_SEQ_NBR INTEGER       NOT NULL 
CORRN_ID     INTEGER       NOT NULL 
RX_CNT     BYTEINT       NOT NULL 
DATA_TYP_CD    BYTEINT       NOT NULL 
DATA_PD_CD    BYTEINT       NOT NULL 
CYC_DT     DATE       NOT NULL 
BASE_DT     DATE       NOT NULL 
DATA_LOAD_DT    DATE       NOT NULL 
DATA_DT     DATE       NOT NULL 
SUPPLIER_DATA_SRC_CD  BYTEINT       NOT NULL 
RX_CHNL_CD    BYTEINT       NOT NULL 
MP_IMS_ID     INTEGER       NOT NULL 
MP_LOC_ID     NUMERIC(30)      
MP_IMS_ID_ACTN_CD   BYTEINT       NOT NULL 
NPI_ID     BIGINT       
NPI_ID_ACTN_CD   BYTEINT       NOT NULL 
MP_DEA_NBR    NATIONAL CHARACTER VARYING(9) 
MP_DEA_NBR_ACTN_CD  BYTEINT       NOT NULL 
+0

真棒腳本Thor。 :) 愛它... – Teja 2013-02-12 16:15:57

0

這不是真的清楚,但看起來你只是想:

awk '{ print $1 > "fields"; print $2 > "data-types" }' 
+0

嗨威廉..謝謝你的答覆。但我的問題很簡單。我需要一列中的所有字段,一列中的數據類型(但是如果你看到像NATIONAL CHARACTER VARYING(56)這樣的數據類型字段,應該考慮作爲數據類型,第3列應包含NOT NULL和NULL值(如果沒有約束)) – Teja 2013-02-11 20:57:49

+1

您需要提供「數據類型」和「字段」的嚴格描述。一旦你有了,你基本上就完成了。 – 2013-02-11 21:12:14

+0

我添加了示例ip/op William – Teja 2013-02-11 21:12:40

1

下面是使用一種方式3210。運行,如:中script.awk

awk -f script.awk sample.txt 

內容:

{ 
    for (i=2;i<=NF;i++) { 

     if ($i FS $(i+1) == x=("NOT NULL")) { 
      break 
     } 

     r = (r ? r FS : "") $i 
    } 

    print $1 > "fields" 
    print r > "data-types" 
    print ($0 ~ x ? x : "") > "not-nulls" 

    r = "" 
} 

另外,這裏是一個班輪:

awk '{ for (i=2;i<=NF;i++) { if ($i FS $(i+1) == x=("NOT NULL")) break; r = (r ? r FS : "") $i } print $1 > "fields"; print r > "data-types"; print ($0 ~ x ? x : "") > "not-nulls"; r = "" }' sample.txt 

在我的測試中,這會產生每三個文件與所需的輸出。 HTH。