unix中的数据拆分
我有一个包含300多个字段的DDL命令,我需要将字段和数据类型分开,并将它们存储到excel电子表格中。一些数据类型之间有空格。下面是我的示例数据 我尝试过的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值
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