首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将单个sql文件拆分为多个文件

将单个sql文件拆分为多个文件
EN

Stack Overflow用户
提问于 2022-01-10 03:06:05
回答 3查看 1.8K关注 0票数 0

我有一个包含多个create的文件master.sql。

master.sql

代码语言:javascript
复制
CREATE TABLE customers (
    customer_id numeric(38) GENERATED BY DEFAULT AS IDENTITY,
    email_address varchar(255) NOT NULL,
    full_name varchar(255) NOT NULL
) ;

CREATE TABLE inventory (
    inventory_id numeric(38) GENERATED BY DEFAULT AS IDENTITY,
    store_id numeric(38) NOT NULL,
    product_id numeric(38) NOT NULL,
    product_inventory numeric(38) NOT NULL
) ;

我想把这个文件分割成不同的文件--一个表一个。为此,我使用鲁宾氏解决方案这里

下面是我使用的awk命令。

代码语言:javascript
复制
awk '/CREATE TABLE/{f=0 ;n++; print >(file=n); close(n-1)} f{ print > file}; /CREATE TABLE/{f=1}'  master.sql

在执行awk命令时,生成没有任何扩展名的表计数文件。尝试使用此文章联系

在创建每个sql文件时,我希望更改表名的文件名。

例如:

  • customers.sql
  • inventory.sql

我正在尝试使用awk命令来获取表名表单master.sql。是否有可能在迭代master.sql时获得表名。

有办法绕道吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-10 03:48:27

下面是一个简单的2步过程:

代码语言:javascript
复制
# Split the files when the string CREATE TABLE is found
csplit master.sql '/CREATE TABLE/'

# Read the first line, extract table name and rename the file
for f in $(ls xx*); 
do 
    table_name=`head -1 $f | awk '{ sub(/.*CREATE TABLE /, ""); sub(/ .*/, ""); print }'`
    mv $f "$table_name.sql"
    echo "Renaming $f to $table_name.sql"; 
done;

->

代码语言:javascript
复制
Renaming xx00 to customers.sql
Renaming xx01 to inventory.sql

->

代码语言:javascript
复制
$ ls
customers.sql inventory.sql master.sql

$ cat customers.sql
  CREATE TABLE customers (
    customer_id numeric(38) GENERATED BY DEFAULT AS IDENTITY,
    email_address varchar(255) NOT NULL,
    full_name varchar(255) NOT NULL
) ;

$ cat inventory.sql
CREATE TABLE inventory (
    inventory_id numeric(38) GENERATED BY DEFAULT AS IDENTITY,
    store_id numeric(38) NOT NULL,
    product_id numeric(38) NOT NULL,
    product_inventory numeric(38) NOT NULL
) ;
票数 1
EN

Stack Overflow用户

发布于 2022-01-10 04:01:16

嗨,你可以用这样的词:

代码语言:javascript
复制
awk 'BEGIN{RS=";"} /CREATE TABLE/{fn = $3 ".sql"; print $0 ";" > fn; close(fn);}' master.sql

BEGIN块将使用;字符作为记录分隔符将输入拆分为sql语句(而不是行)。

然后,如果该行根据第三个字段(表名)将CREATE TABLE与文件名匹配,则可以打印语句内容。

注意:如果有任何包含;的sql注释,这可能就不太好用了。

编辑以关闭文件(见@ EDITED的注释)

票数 3
EN

Stack Overflow用户

发布于 2022-01-10 13:55:38

您使用的awk命令对于您所做的操作来说是非常复杂的。所需要的是:

代码语言:javascript
复制
awk '/CREATE TABLE/{close(n); n++} {print > n}' file

对于您的新需求,这只是对以下几个方面的调整:

代码语言:javascript
复制
$ awk '/CREATE TABLE/{close(out); out=$3 ".sql"} {print > out}' file
代码语言:javascript
复制
$ head *.sql
==> customers.sql <==
CREATE TABLE customers (
    customer_id numeric(38) GENERATED BY DEFAULT AS IDENTITY,
    email_address varchar(255) NOT NULL,
    full_name varchar(255) NOT NULL
) ;


==> inventory.sql <==
CREATE TABLE inventory (
    inventory_id numeric(38) GENERATED BY DEFAULT AS IDENTITY,
    store_id numeric(38) NOT NULL,
    product_id numeric(38) NOT NULL,
    product_inventory numeric(38) NOT NULL
) ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70647373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档