我通常需要为我的研究做大量的文本处理,例如从所有行中删除最后一个标记,从每行中提取前两个标记,将每一行拆分为标记等。
执行此操作的最佳方法是什么?我应该为此学习 Perl 吗?还是我应该学习某种 shell 命令?主要关心的是速度。如果我需要为这些东西编写长代码,那就达不到目的了。
编辑:
我根据@Mimisbrunnr 的建议开始学习 sed 并且已经可以做我需要做的事情。但似乎人们更青睐awk。所以,会尝试的。感谢您的回复。
我通常需要为我的研究做大量的文本处理,例如从所有行中删除最后一个标记,从每行中提取前两个标记,将每一行拆分为标记等。
执行此操作的最佳方法是什么?我应该为此学习 Perl 吗?还是我应该学习某种 shell 命令?主要关心的是速度。如果我需要为这些东西编写长代码,那就达不到目的了。
编辑:
我根据@Mimisbrunnr 的建议开始学习 sed 并且已经可以做我需要做的事情。但似乎人们更青睐awk。所以,会尝试的。感谢您的回复。
想到 Perl 和 awk,虽然 Python 也可以,但如果你不想学习一门新语言的话。
Perl 是一种通用语言,awk 更倾向于您所描述的类型的文本处理。
对于进行简单的蒸汽编辑,sed 是大多数 *nix 机器上标配的一个很棒的实用程序,但对于任何比我建议进入 Perl 更复杂的东西。曲线并没有那么糟糕,它非常适合编写大多数形式的常规文本解析。可以在这里找到一个很好的参考。
#!/usr/bin/env python
# process.py
import fileinput
for line in fileinput.input(): # you could use `inplace=True` parameter here
words = line.split() # e.g. split on white spaces
all_except_last = words[:-1]
print ' '.join(all_except_last)
# or
first_two = words[:2]
print ' '.join(first_two)
例子:
$ echo a b c | python process.py
$ ./process.py input.txt another.txt
*nixawk/grep/tail/head/sed
等工具是很好的文件处理工具。如果要在文件中搜索模式并处理它们,可以使用 awk。对于大文件,您可以使用 grep+awk 的组合。Grep 的模式搜索速度和 awk 处理文本的能力。关于 sed,通常 sed 做什么,awk 已经可以做到,所以我发现使用 sed 进行文件处理是多余的。
就处理文件的速度而言,awk 通常与 Perl 或其他语言相当,有时甚至更好。
此外,还有 2 个非常好的工具可以快速获取文件的前后部分,它们是tail
和head
. 因此,要获取最后一行,您可以使用tail
.
当然,最好的工具取决于要执行的任务。除了通常的 *nix 工具(如 sed/awk 等)和其他人引用的编程语言(Perl、Python)之外,目前对于我需要的文本处理,原始数据格式不遵循严格的解析规则但可能略有不同,我发现自己非常适合我在 Vim 编辑器中调用的 Vim 宏和 Vimscript 函数。
像这样的东西(对于未启动 Vim 的人):您编写处理函数,例如。文件 script.vim 上的 TxtProcessingToBeDone1(),使用 :source script.vim 获取它,然后打开要编辑的文件并:
:调用 TxtProcessingToBeDone1()
一次在整个缓冲区上或作为一次性操作使用@: 和@@ 键在现场重复。也可以使用 :bufdo 和 :argdo 同时处理多个缓冲区/文件。
使用 Vimscript 功能,您可以重复在常规编辑会话中执行的所有任务(搜索模式、正则表达式、替换、移动到、删除、拉动等),自动化它并应用一些编程控制流(如果/那么)。
类似的考虑也适用于其他高级脚本编辑器。