텍스트 파일을 특정 이름과 내용을 가진 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

텍스트 파일을 특정 이름과 내용을 가진 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

file.txt이 스타일을 따르는 콘텐츠가 있습니다 .

Target 99C - HJ Shove vs CO + SB SQ
[0.02]JdJh, JsJh, JcJh, JsJd, JcJd, JcJs, AhKh, AdKd, AsKs, AcKc[/0.02], [30.30]KdKh, KsKh, KcKh, KsKd, KcKd, KcKs[/30.30], [31.52]QdQh, QsQh, QcQh, QsQd, QcQd, QcQs[/31.52], [61.57]AdKh, AsKh, AcKh, AhKd, AsKd, AcKd, AhKs, AdKs, AcKs, AhKc, AdKc, AsKc[/61.57]

Target 100A - HJ Call vs BU + SB SQ
[0.01]Ah5h, Ad5d, As5s, Ac5c[/0.01], [0.06]KhTh, KdTd, KsTs, KcTc[/0.06], [0.13]JhTh, JdTd, JsTs, JcTc[/0.13], [0.43]AdAh, AsAh, AcAh, AsAd, AcAd, AcAs[/0.43], [0.59]7d7h, 7s7h, 7c7h, 7s7d, 7c7d, 7c7s[/0.59], [0.77]AhJh, AdJd, AsJs, AcJc[/0.77], [2.44]5d5h, 5s5h, 5c5h, 5s5d, 5c5d, 5c5s[/2.44], [7.06]6h5h, 6d5d, 6s5s, 6c5c[/7.06], [7.21]QdQh, QsQh, QcQh, QsQd, QcQd, QcQs[/7.21], [7.52]5h4h, 5d4d, 5s4s, 5c4c[/7.52], [8.69]KhJh, KdJd, KsJs, KcJc[/8.69], [9.89]6d6h, 6s6h, 6c6h, 6s6d, 6c6d, 6c6s[/9.89], [11.61]8d8h, 8s8h, 8c8h, 8s8d, 8c8d, 8c8s[/11.61], [11.73]9d9h, 9s9h, 9c9h, 9s9d, 9c9d, 9c9s[/11.73], [18.21]JdJh, JsJh, JcJh, JsJd, JcJd, JcJs[/18.21], [24.60]TdTh, TsTh, TcTh, TsTd, TcTd, TcTs[/24.60], [29.64]KhQh, KdQd, KsQs, KcQc[/29.64], AhQh, AdQd, AsQs, AcQc

Target 100B - HJ 4B to 29bb vs BU + SB SQ
[0.07]Ah6h, Ad6d, As6s, Ac6c[/0.07], [0.24]AhTh, AdTd, AsTs, AcTc[/0.24], [5.89]TdTh, TsTh, TcTh, TsTd, TcTd, TcTs[/5.89], [7.59]Kh9h, Kd9d, Ks9s, Kc9c[/7.59], [10.18]Ah3h, Ad3d, As3s, Ac3c[/10.18], [12.39]AdQh, AsQh, AcQh, AhQd, AsQd, AcQd, AhQs, AdQs, AcQs, AhQc, AdQc, AsQc[/12.39], [22.67]Kh7h, Kd7d, Ks7s, Kc7c[/22.67], [25.08]Kh6h, Kd6d, Ks6s, Kc6c[/25.08], [25.74]Kh8h, Kd8d, Ks8s, Kc8c[/25.74], [28.31]KhTh, KdTd, KsTs, KcTc[/28.31], [48.85]AdKh, AsKh, AcKh, AhKd, AsKd, AcKd, AhKs, AdKs, AcKs, AhKc, AdKc, AsKc[/48.85], [49.25]Ah5h, Ad5d, As5s, Ac5c[/49.25], [55.40]QdQh, QsQh, QcQh, QsQd, QcQd, QcQs[/55.40], [61.48]JdJh, JsJh, JcJh, JsJd, JcJd, JcJs[/61.48], [91.31]KhJh, KdJd, KsJs, KcJc[/91.31], [96.32]AhJh, AdJd, AsJs, AcJc[/96.32], [99.57]AdAh, AsAh, AcAh, AsAd, AcAd, AcAs[/99.57], [99.89]AhKh, AdKd, AsKs, AcKc[/99.89], [99.99]KdKh, KsKh, KcKh, KsKd, KcKd, KcKs[/99.99]

Target 100C - HJ Shove vs BU + SB SQ
[0.01]KdKh, KsKh, KcKh, KsKd, KcKd, KcKs[/0.01], [0.11]AhKh, AdKd, AsKs, AcKc[/0.11], [20.31]JdJh, JsJh, JcJh, JsJd, JcJd, JcJs[/20.31], [37.39]QdQh, QsQh, QcQh, QsQd, QcQd, QcQs[/37.39], [51.15]AdKh, AsKh, AcKh, AhKd, AsKd, AcKd, AhKs, AdKs, AcKs, AhKc, AdKc, AsKc[/51.15]

Target 101A - HJ Call vs CO + BU SQ
[0.08]5h4h, 5d4d, 5s4s, 5c4c[/0.08], [0.13]6h5h, 6d5d, 6s5s, 6c5c[/0.13], [0.56]TdTh, TsTh, TcTh, TsTd, TcTd, TcTs[/0.56], [0.71]QdQh, QsQh, QcQh, QsQd, QcQd, QcQs[/0.71], [1.75]8d8h, 8s8h, 8c8h, 8s8d, 8c8d, 8c8s[/1.75], [2.18]7d7h, 7s7h, 7c7h, 7s7d, 7c7d, 7c7s[/2.18], [3.68]9d9h, 9s9h, 9c9h, 9s9d, 9c9d, 9c9s[/3.68], [5.68]KhQh, KdQd, KsQs, KcQc[/5.68], [10.56]JdJh, JsJh, JcJh, JsJd, JcJd, JcJs[/10.56], [17.73]AhQh, AdQd, AsQs, AcQc[/17.73]

파일은 일정 기간 동안 지속되며 총 300개의 "대상"을 포함합니다. 이 파일을 ~300개의 파일로 분할하고 싶으므로 "[0.08]"부터 "[/17.73]"까지 모든 내용을 포함하는 "HJ Call vs CO + BU SQ.txt"라는 파일이 있을 것입니다.

나는 csplit 사용을 고려했지만 이름을 변경할 수 없다고 확신하기 때문에 작동하지 않습니다. grep & tee를 고려하고 있지만 다시 그것이 올바른 접근 방식인지 잘 모르겠습니다. 이 문제에 대한 간단한 해결책을 아는 사람이 있습니까?

저는 WSL(Linux용 Windows 하위 시스템)을 사용하고 있습니다.

감사해요!

답변1

당신은 그것을 사용할 수 있습니다 awk:

awk -F ' - ' '/^Target/{fn=$2} !/^Target|^$/{print >> fn}' file.txt
  • -F ' - 'awk주변 공간과 대시로 분리됩니다 .
  • /^Target/{fn=$2}fn파일 이름(두 번째 필드)으로 설정됩니다 .
  • !/^Target|^$/{print >> fn}파일 이름과 일치하지 않는 줄 내용 ^Target이나 빈 줄( )이 인쇄됩니다.^$

Windows를 사용하는 경우 파일에 Unix 줄 끝이 있는지 주의 깊게 살펴보세요.

답변2

python및 모듈 groupby의 메소드 itertools. groupby 메소드는 반복자(이 경우 입력 파일의 파일 핸들)와 groupby에 무엇을 그룹화할지 알려주는 함수(이 경우 빈 줄을 찾는 람다 함수)의 두 가지 입력을 사용합니다.

dos2unix file

python3 -c 'import sys, itertools as it
ifile = sys.argv[1]
with open(ifile) as f:
  for k,igrp in it.groupby(f, lambda x: x == "\n"):
    if not k:
      G = list(igrp)
      outfile = G.pop(0).rstrip().split("-")[1].lstrip()+".txt"
      with open(outfile,"w") as fp:
        fp.writelines(G)
' file

관련 정보