【问题标题】:how to extract set of lines using separator from file in UNIX如何在 UNIX 中使用分隔符从文件中提取行集
【发布时间】:2014-06-04 11:12:40
【问题描述】:

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

输入文件: query.sql

select * from 
DBNAME.table1;

select * from 
DBNAME.table2
;

select * from 
DBNAME.table3
WHERE date<= current_date-30;

输出应该是

file1: query1.sql

select * from 
DBNAME.table1;

file2:query2.sql

select * from 
DBNAME.table2
;

file3:query3.sql

select * from 
DBNAME.table3
WHERE date<= current_date-30;

【问题讨论】:

    标签: unix awk sed pattern-matching text-extraction


    【解决方案1】:

    这样就可以了:

    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;
    

    【讨论】:

    • 非常感谢。我用 -v RS=";"而不是 -v RS="" 因为我希望段落用“;”分隔
    • 好一个!那它解决了你的问题吗,@Abdul?由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking
    • 是的,我得到了我需要的东西。
    • 如果我只想提取第二个查询,我该如何修改上述命令。即从 DBNAME.table2 中选择 * ;
    • @Abdul 好吧,你可以做 awk -v RS="" 'NR==2{print &gt; "query2.sql"}' file。这将提取第二段。
    【解决方案2】:

    您可以使用这些 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
    

    【讨论】:

    • 请尽量充实您的答案。仅仅发布一个没有任何解释或上下文的代码块是不好的。在目前的状态下,您的答案可能对将来寻找此问题答案的人没有任何用处。
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 2011-01-02
    • 2019-05-15
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多