根据模式将文件拆分为多个文件

ope*_*ony 17 awk text-processing

我有一个几百行长的大文件。这个文件被一个特定的标识符分成许多部分,比如说“ABC”。这一行“ABC”出现了 6 次,所以我想要 6 个输出文件。我熟悉 split 和 awk 但似乎无法创建一个命令行来执行我所描述的操作,有什么想法吗?

这是一个例子

ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1
Run Code Online (Sandbox Code Playgroud)

我想要三个文件,其中 ABC 是新文件中的第一行,它在遇到下一个 ABC 之前结束。

ste*_*ver 19

使用 csplit

csplit -z somefile /ABC/ '{*}'
Run Code Online (Sandbox Code Playgroud)

默认情况下xx00,输出文件将为, xx01, ... 但您可以根据需要更改格式和编号 - 请参阅man csplit

  • 文件不是按照分割模式命名的? (2认同)

Dop*_*oti 9

NEEDLE=ABC
HAYSTACK=/path/to/bigfile
csplit -f splitfile_ $HAYSTACK /$NEEDLE/ "{$(($(grep -c -- $NEEDLE $HAYSTACK)-1))}"
for file in splitfile_*; do
    sed --in-place "s/$NEEDLE//" $file
done
Run Code Online (Sandbox Code Playgroud)

无论您有多少个标记行实例,上面的代码都会根据要求分割文件,然后从结果文件中删除标记。输出文件将被称为,例如splitfile_00,,splitfile_01等等。

在调用结束时拆开这一点csplit:: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"我们使用子 shellgrep来获取文件中标记的实例数,并减去一 - 这csplit准确地告诉了它将进行多少次分割。

请注意,正如所写,如果您的标记出现在数据中,事情可能会变成梨形。

  • 当要搜索的模式以破折号开头时,这会导致错误,从而阻止答案应用于更通用的情况。然后它被解释为“grep”的命令行参数。解决办法是在grep命令中的`$NEEDLE`前添加`--`。 (2认同)