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

xdyibdwo  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(368)

我有一个文件master.sql包含许多创建表ddl的。
master.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
) ;

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
) ;

我想把这个文件拆分成单独的文件,每个文件对应一个表,为此我使用rubin's解决方案here
下面是我使用的awk命令。

awk '/CREATE TABLE/{f=0 ;n++; print >(file=n); close(n-1)} f{ print > file}; /CREATE TABLE/{f=1}'  master.sql

执行awk命令时生成带有表计数但没有任何扩展名的文件。尝试使用此article联系
当创建每个sql文件时,我想将文件名改为表名。
例如:

  • customers.sql
  • inventory.sql

我正在尝试使用awk命令从master.sql中获取表名在master.sql迭代过程中是否可以获取表名
有什么办法吗?

w8ntj3qf

w8ntj3qf1#

嗨,您可以使用类似以下的内容:

awk 'BEGIN{RS=";"} /CREATE TABLE/{fn = $3 ".sql"; print $0 ";" > fn; close(fn);}' master.sql

X1 M0 N1 X块将通过使用X1 M1 N1 X字符作为记录分隔符来将输入拆分成SQL语句(而不是行)。
如果该行将CREATE TABLE与基于第三个字段(表名)的文件名匹配,则可以打印语句内容
注意:如果存在任何包含;的sql注解,这可能不会很好地工作。
编辑以关闭文件(参见@ed-morton的评论)

hc2pp10m

hc2pp10m2#

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

# 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;
Renaming xx00 to customers.sql
Renaming xx01 to inventory.sql
$ 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
) ;
qgzx9mmu

qgzx9mmu3#

你使用的awk命令对于你正在做的事情来说太复杂了。它所需要的只是:

awk '/CREATE TABLE/{close(n); n++} {print > n}' file

而对于您的新需求,它只是一个调整:

$ awk '/CREATE TABLE/{close(out); out=$3 ".sql"} {print > out}' file
$ 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
) ;

相关问题