ファイルの読み取り:開始パターンと終了パターンを含むパターン間のすべてのテキストを選択し、パターンセットごとに新しいファイルを作成します。

ファイルの読み取り:開始パターンと終了パターンを含むパターン間のすべてのテキストを選択し、パターンセットごとに新しいファイルを作成します。

以下を含む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

元の入力ファイルの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ファイルを抑制するために使用されます。

関連情報