-2

我已尽力理解一个非常相似的 StackOverflow 问题,但我无法终生提出建议gawksplit解决方案适用于我的情况。

我有一个包含 288 个提案的大型文本文件,每个提案的长度为 300 到 500 个单词,段落数量不等(因此行数不一致)。但是,每个提案都以以下性质的标识符开头:--###----####--。没有结束标记——尽管我想我可以通过对原始文件进行一些正则表达式搜索和替换来插入一个,然后再将其拆分为多个文件。我想要的是 288 个单独的文本文件的集合,每个文件都由两个破折号之间的数字命名。如果它使事情变得更容易,我可以轻松地将文件拆分为以三个数字开头的提案和以四个数字开头的提案。

简而言之,我想这样做:

#! /bin/env bash or python

Split all_proposals.txt into 121.txt, 122.txt, etc.

Where all_proposals.txt consists of:

  --121--

  One Line Title of Proposal

  Followed by several paragraphs each on a line of variable length.

  Another paragraph for effect.

  --122--

  More lines indeterminate in number.
4

3 回答 3

1

每次看到带有标题的行时,只需设置输出文件的名称:

awk '/--[0-9]*--/ {split( $0, a, "--" ); output=a[2]".txt" }
    { print > output }' all_proposals.txt

请注意,这会将标题行打印到文件中。如果您不希望这样,请next在标题的操作序列中添加一个命令。

于 2012-06-18T20:19:49.953 回答
0

您可以在 python 中使用正则表达式在几行中解决这个问题。看看文档;

那么,这个想法是搜索您的标识符,在这种情况下,它可能带有类似的表达式

r'(--[0-9]*--)'

特别是,看看re.split

于 2012-06-18T20:25:04.913 回答
0

您可以使用 perl:

#!/usr/bin/perl
open(FI,"file.txt");
read(FI,$_,10000000);
close(FI);
@arr = split('--###--');
$cnt=0;
for $c (@arr)
{
    open(FO,">$cnt.txt");
    print FO $c;
    close(FO);
    $cnt++;
}
于 2012-06-18T20:26:48.157 回答