读取文件:拾取模式之间的每个文本,包括开始和结束模式,并为每个模式集创建新文件

读取文件:拾取模式之间的每个文本,包括开始和结束模式,并为每个模式集创建新文件

我有一个名为 on Linux 的文件file.txt,其中包含:

sqlplus -s insert into table;  
commit;  
!  
sqlplus -s insert into table;  
commit;  
!  
sqlplus -s insert into table;  
commit;  
!
  
.  
.   

我想创建多个文件,如下所示:

文件1.txt:-

sqlplus -s insert into table;  
commit;  
!   

文件2.txt

sqlplus -s insert into table;  
commit;  
!   

答案1

使用awk

$ awk '/^sqlplus/ {close(sql);sql="file"++c".txt"} {print > sql}' input_file
$ head *
==> file1.txt <==
sqlplus -s insert into table;
commit;
!

==> file2.txt <==
sqlplus -s insert into table;
commit;
!

==> file3.txt <==
sqlplus -s insert into table;
commit;
!

.
.

答案2

典型工作awk

START_PATTERN='^sqlplus -s' END_PATTERN='^!$' awk '
  !file && $0 ~ ENVIRON["START_PATTERN"] {
    file = sprintf("file%03d.txt", ++n)
  }
  file {
    print > file
    if ($0 ~ ENVIRON["END_PATTERN"]) {
      file = ""
      close(file)
    }
  }' < your-file

这种方法允许行匹配开始和结束模式(在您的情况下不可能)。

答案3

如果为原始输入文件的每三行创建一个文件就足够了,您可以执行以下操作(使用 GNU awk):

awk 'NR%3==1{a++} {print > "file"a".txt"}' file.txt 

在您的数据上运行此命令会产生:

$ ls file?.txt 
file1.txt  file2.txt  file3.txt

答案4

一个更简单的解决方案csplit

csplit infile -z -f 'file' '/^sqlplus/' '{*}'


╰─ → $ cat file00
sqlplus -s insert into table;
commit;
!
╰─ → $ cat file01
sqlplus -s insert into table;
commit;
!
╰─ → $ cat file02
sqlplus -s insert into table;
commit;
!

-f用于设置前缀并-z抑制空文件。

相关内容