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
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准确地告诉了它将进行多少次分割。
请注意,正如所写,如果您的标记出现在数据中,事情可能会变成梨形。