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

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

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

这是一个例子

ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1

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

答案1

使用csplit

csplit -z somefile /ABC/ '{*}'

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

答案2

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

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

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

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

相关内容