我有一个名为 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
抑制空文件。