Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unix中的数据拆分_Unix_Awk_Cut - Fatal编程技术网

unix中的数据拆分

unix中的数据拆分,unix,awk,cut,Unix,Awk,Cut,我有一个包含300多个字段的DDL命令,我需要将字段和数据类型分开,并将它们存储到excel电子表格中。一些数据类型之间有空格。下面是我的示例数据 我尝试过的 cut -f2 sample.txt | grep -e "^$" -v > sample1.txt cut -f1 -d" " sample1.txt > fields.txt 我可以从输入文件中获取column1,但如何分别获取数据类型字段和NOTNULL约束。此外,如果没有NOTNULL约束,则输出文件应具有NULL值

我有一个包含300多个字段的DDL命令,我需要将字段和数据类型分开,并将它们存储到excel电子表格中。一些数据类型之间有空格。下面是我的示例数据

我尝试过的

cut -f2 sample.txt | grep -e "^$" -v > sample1.txt
cut -f1 -d" " sample1.txt > fields.txt
我可以从输入文件中获取column1,但如何分别获取数据类型字段和NOTNULL约束。此外,如果没有NOTNULL约束,则输出文件应具有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 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
田地

数据类型

不为空


不太清楚,但看起来你只是想:

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

这有点棘手。您可以在每行末尾查找“NULL”,并相应地处理输入:

解析.awk

输出:

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

这里有一种使用
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 = ""
}
{
对于(i=2;i“字段”
打印r>“数据类型”
打印($0~x?x:)>“非空”
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
awk'{for(i=2;i“字段”;print r>“数据类型”;print($0~x?x:)>“非空”;r=”“}”sample.txt

在我的测试中,这将生成三个文件,每个文件都具有所需的输出。HTH。

您是否尝试了某项操作,或者希望有人执行您的工作?您的输出列表中缺少一个“NOTNULL”。为什么要将其放入单独的文件中?为什么不使用“CSV”数据,然后,如果需要单独处理,只需在电子表格中进行处理?一个包含300行“NOT NULL”和一些空格的文件将很难检查其有效性。嗨,威廉。谢谢你的回答。但我的问题很简单。我需要一列中的所有字段,一列中的数据类型(但如果您看到一个数据类型字段,如NATIONAL CHARACTER Variable(56),则应将其视为一个数据类型,第三列应包含NOTNULL和NULL值(如果没有约束条件)),您需要提供“数据类型”和“字段”的严格描述我添加了示例ip/op WilliamData类型,告诉您字段是数字、整数、字符还是字节,而字段是表中的列名。(Oracle表)
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
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