我有一个包含300多个字段的DDL命令,我需要分别将字段和数据类型分开并将它们存储到excel电子表格中。某些数据类型之间有空格。这是我的样本数据,如下所示。 / p>
我尝试了什么
cut -f2 sample.txt | grep -e "^$" -v > sample1.txt
cut -f1 -d" " sample1.txt > fields.txt
我能够从输入文件中获取column1但是如何单独获取数据类型字段和单独的NOT NULL约束。如果没有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
输出
字段
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 :(得分: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
答案 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
在我的测试中,这会生成三个文件,每个文件都有所需的输出。 HTH。
答案 2 :(得分:0)
这不是很清楚,但看起来你只是想要:
awk '{ print $1 > "fields"; print $2 > "data-types" }'