【问题标题】:Split text file into multiple files upon nth instance of delimiter [duplicate]在分隔符的第 n 个实例上将文本文件拆分为多个文件 [重复]
【发布时间】:2017-01-07 05:16:37
【问题描述】:

我有一个大文本文件,其中包含一组重复的数据,每个条目的标题-XXXX- 和页脚$$$$。大约有 20k 个条目,我想将其分成每个 500 个条目的文件。

我一直在玩弄awk 并使用下面的命令来关闭它。每个文件都以-XXXX- 开头,但第一个文件之后的每个文件最后都有一个部分条目。

awk "/-XXXX-/ { delim++ } { file = sprintf(\"file%s.sdf\", int(delim / 500)); print > file; }" < big.sdf

例如:

-XXXX-
Beginning
Middle
End
$$$$
-XXXX-
Beginning

我希望每个文件在 $$$$ 之后立即结束。

我在 Windows 上使用awk

【问题讨论】:

  • 当您说“第一个文件之后的每个文件末尾都有部分条目”时,您是在描述输入数据文件还是当前获得的输出?
  • 我目前得到的输出。第一个文件正确地在 $$$$ 下方截断。后续文件包括 -XXXX- 之后的部分条目。注意:我发现如果我在我的 Windows 机器上的 Cygwin shell 中运行上面的代码,我会得到正确的行为,但是如果我通过 Windows 中的命令提示符运行它,它就会像上面描述的那样搞砸。
  • 我很难弄清楚发生了什么。我再也无法访问任何 Windows 机器了——这是几十年来的第一次——所以我不能尝试很容易地复制这个问题。你说的话听起来很奇怪。文件是否以换行符终止(Windows 上的 CRLF)?如果不是,那可能是您所看到的部分原因。
  • 您指的是哪些文件?输入还是输出?
  • 主要是输入文件,但我试图确保我理解这些问题,因为可能存在持续存在的问题(如果没有问题,你就不会仍然提问)。您可以修改问题以明确您在每一点上所说的内容;如果您可以显示一个包含 6 个条目的输入文件,以及将其拆分为 3 个包含 2 个条目的文件和/或 2 个每个包含 3 个条目的文件时所得到的内容,那就太好了。如果最坏的情况变得最糟,请给我发送电子邮件(请参阅我的个人资料),其中包含示例数据文件以及您的脚本和示例输出文件(您得到什么以及您想要什么)。

标签: awk


【解决方案1】:

那么如果 -XXXX- 和 $$$$ 之间的每组数据都是一条记录,你想一次写入 500 条记录来分隔文件吗?似乎您需要两个计数器 - 一个用于刚刚上升的输出文件名,另一个用于当前“批次”中的记录数,最高可达 500,但随后在下一批中重置为零。比如:

BEGIN {fctr=1 ; rctr=0 ; file=("file" fctr ".sdf")}
/^\$\$\$\$$/ {print > file ; rctr+=1}
rctr==500 {fctr+=1 ; file=("file" fctr ".sdf") ; rctr=0}
!/^\$\$\$\$$/ {print > file}
  • 第 1 行设置初始值并从 file1.sdf 开始

  • 第 2 行匹配每条记录的页脚,每次看到一条记录计数器(以及写出当前页脚),我们都会增加记录计数器

  • 第 3 行是当我们达到 500 条记录时。首先移动到下一个文件名,然后将记录数重置为零

  • 第 4 行用于所有常规行。只需将它们发送到当前文件名即可

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2013-04-22
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多