如何在UNIX中使用分隔符从文件中提取行集

如何在UNIX中使用分隔符从文件中提取行集,unix,awk,sed,pattern-matching,text-extraction,Unix,Awk,Sed,Pattern Matching,Text Extraction,我在一个平面文件中有以下3个查询。我想将3个查询分别拆分为3个文件。每个查询用“;”(分号)分隔。请建议我怎么做 输入文件:query.sql select * from DBNAME.table1; select * from DBNAME.table2 ; select * from DBNAME.table3 WHERE date<= current_date-30; 文件2:query2.sql select * from DBNAME.table2 ; 文件3:q

我在一个平面文件中有以下3个查询。我想将3个查询分别拆分为3个文件。每个查询用“;”(分号)分隔。请建议我怎么做

输入文件:query.sql

select * from 
DBNAME.table1;

select * from 
DBNAME.table2
;

select * from 
DBNAME.table3
WHERE date<= current_date-30;
文件2:query2.sql

select * from 
DBNAME.table2
;
文件3:query3.sql

select * from 
DBNAME.table3
WHERE date<= current_date-30;
从中选择*
DBNAME.table3
其中日期这可以使它:

awk -v RS="" '{print > "query"(++i)".sql"}' file
使用
-v RS=”“
我们将每个记录定义为一个段落。然后就是将它们打印到
queryNUMBER.sql
。为此,我们使用每次递增的
++i

请参见创建的文件:

$ cat query1.sql 
select * from 
DBNAME.table1;

$ cat query2.sql 
select * from 
DBNAME.table2
;

$ cat query3.sql 
select * from 
DBNAME.table3
WHERE date<= current_date-30;
$cat query1.sql
从中选择*
DBNAME.table1;
$cat query2.sql
从中选择*
DBNAME.table2
;
$cat query3.sql
从中选择*
DBNAME.table3

其中date您可以使用这些sed命令获取每组行,并将它们发送到正确的文件。第一个sed命令获取第1行和第2行,并将它们发送到query1.sql。第二个sed命令获取第4行到第6行,并将它们发送到query2.sql。第三个sed命令获取第8行到第10行,并将它们发送到query3.sql

#!/bin/sh

sed -n '1,2p' query.sql > query1.sql
sed -n '4,6p' query.sql > query2.sql
sed -n '8,10p' query.sql > query3.sql

非常感谢你。我使用了-v RS=“;”而不是-v RS=“”,因为我想用“;”来分隔这段文字!“这解决了你的问题吗,@Abdul?”?既然你是新来的,如果你的问题已经解决了,请别忘了把答案标为“接受”。您可以点击答案旁边的复选标记,将答案从空心切换为绿色。看看你是否有任何疑问!是的,我得到了我所需要的。如果我只想提取第二个查询,如何修改上述命令。i、 e.从DBNAME.table2中选择*@例如,您可以执行
awk-vrs=“”NR==2{print>“query2.sql”}文件
。这将摘录第二段,请尽量充实你的答案。仅仅发布一个代码块而没有任何解释或上下文是不好的。在目前的状态下,你的答案可能对将来寻找这个问题答案的人没有任何用处。
#!/bin/sh

sed -n '1,2p' query.sql > query1.sql
sed -n '4,6p' query.sql > query2.sql
sed -n '8,10p' query.sql > query3.sql