다음을 포함 하는 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
빈 파일을 억제하는 데 사용됩니다.