我有一个长达几百行的大文件。该文件由特定标识符划分为许多部分,例如“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
准确地告诉了它将进行多少次分割。
请注意,正如所写,如果您的标记出现在数据中,事情可能会变成梨形。