如何将一个文本文件拆分为多个具有特定名称和内容的文本文件?

如何将一个文本文件拆分为多个具有特定名称和内容的文本文件?

我有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个文件,所以会有一个名为“HJ Call vs CO + BU SQ.txt”的文件,其中包含从“[0.08]”到“[/17.73]”的所有内容。

我已经考虑过使用 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 对什么进行分组的函数(在我们的例子中是一个查找空行的 lambda 函数)

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

相关内容