1

300 以上のフィールドを持つ DDL コマンドがあり、フィールドとデータ型を別々に分離して Excel スプレッドシートに保存する必要があります。一部のデータ型の間にスペースが含まれています。サンプル データを以下に示します。

私が試したこと

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

入力ファイルから column1 を取得できますが、データ型フィールドと NOT NULL 制約を個別に取得するにはどうすればよいですか。また、NOT NULL 制約がない場合、出力ファイルには代わりに NULL 値が必要です。

入力

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

出力

田畑

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

非 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

NOT NULL
4

3 に答える 3

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
于 2013-02-11T21:43:20.547 に答える
1

を使用する 1 つの方法を次に示しawkます。次のように実行します。

awk -f script.awk sample.txt

の内容script.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 = ""
}

または、ここにワンライナーがあります:

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

私のテストでは、これにより、それぞれが目的の出力を持つ 3 つのファイルが生成されます。HTH。

于 2013-02-11T23:22:52.900 に答える
0

それは本当に明確ではありませんが、あなたが望むように見えます:

awk '{ print $1 > "fields"; print $2 > "data-types" }'
于 2013-02-11T20:47:25.387 に答える