我通常需要为我的研究做大量的文本处理,例如从所有行中删除最后一个标记,从每一行中提取前两个标记,将每一行拆分为标记等。
执行此操作的最佳方法是什么?我应该为此学习Perl吗?或者我应该学习某种shell命令?主要关注的是速度。如果我需要为这些东西编写长代码,它就会失败。
编辑:
我开始在@Mimisbrunnr的推荐下学习sed,并且已经可以做我需要的了。但似乎人们更喜欢awk。所以,会尝试。感谢您的所有回复。
答案 0 :(得分:6)
Perl和awk浮现在脑海中,虽然Python会这样做,如果你不想学习一门新语言。
Perl是一种通用语言,awk更侧重于您所描述类型的文本处理。
答案 1 :(得分:3)
对于简单的蒸汽编辑,sed是一个很好的实用工具,是大多数* nix盒子的标准配置,但对于任何比我建议进入Perl更复杂的东西。曲线并没有那么糟糕,它非常适合编写大多数形式的常规文本解析。可以找到一个很好的参考here。
答案 2 :(得分:1)
#!/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
答案 3 :(得分:1)
* {nix}工具如awk/grep/tail/head/sed
等是很好的文件处理工具。如果要在文件中搜索模式并处理它们,可以使用awk。对于大文件,您可以使用grep + awk的组合。 Grep的模式搜索速度和awk操作文本的能力。关于sed,oftern sed做了什么,awk已经可以做到了,所以我觉得使用sed进行文件处理是多余的。
就处理文件的速度而言,awk通常与Perl或其他语言相当,有时甚至更好。
此外,2个非常好的工具,用于快速获取文件的正面和背面部分,tail
和head
。因此,要获得最后一行,您可以使用tail
。
答案 4 :(得分:0)
当然,最好的工具取决于要执行的任务。除了通常的* nix工具,如sed / awk等,以及其他人引用的编程语言(Perl,Python),目前我需要的文本处理原始数据格式不遵循严格的解析规则但可能略有不同,我发现自己我在Vim编辑器中调用了Vim宏和Vimscript函数。
像这样的东西(对于Vim没有开始):你编写处理函数,例如。文件script.vim上的TxtProcessingToBeDone1(),源代码为:source script.vim,然后打开你要编辑的文件,并且:
:调用TxtProcessingToBeDone1()
立即在整个缓冲区上或作为一次性操作,用@:和@@键在现场重复。还可以使用以下命令同时处理多个缓冲区/文件:bufdo和:argdo。
使用Vimscript函数,您可以重复在常规编辑会话中执行的所有任务(搜索模式,注册,替换,移动,删除,抽取等等),自动执行它并应用一些编程控制流程(if / then)。
类似的注意事项也适用于其他高级脚本编辑器。