以下を含む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
ファイルを抑制するために使用されます。