【问题标题】:What's the best tool to do text processing in Linux or Mac? [closed]在 Linux 或 Mac 中进行文本处理的最佳工具是什么? [关闭]
【发布时间】:2011-01-27 13:54:18
【问题描述】:

我通常需要为我的研究做大量的文本处理,例如从所有行中删除最后一个标记,从每行中提取前两个标记,将每一行拆分为标记等。

执行此操作的最佳方法是什么?我应该为此学习 Perl 吗?还是我应该学习某种 shell 命令?主要关心的是速度。如果我需要为这些东西编写长代码,那就达不到目的了。

编辑:

我在 @Mimisbrunnr 的推荐下开始学习 sed,并且已经可以做我需要做的事情。但似乎人们更青睐awk。所以,会尝试的。感谢您的所有回复。

【问题讨论】:

  • 你已经知道哪些编程语言?
  • C、Java、一点点 Python .. 等等。
  • 阅读“掌握正则表达式”并学习 Perl、Python 或 Ruby 或任何在您的实验室/领域/在您的同事/最近的人中最流行的语言,您可以定期提出问题。
  • 这不是一个真正的编程问题。投票转为超级用户。
  • 这是一个编程问题:他在问用什么编程语言来处理文本文件。

标签: linux text-processing


【解决方案1】:

对于进行简单的蒸汽编辑,sed 是一个很棒的实用程序,它是大多数 *nix 机器的标准配置,但对于任何比我建议进入 Perl 的复杂得多的东西。曲线并没有那么糟糕,它非常适合编写大多数形式的常规文本解析。一个很好的参考可以找到here

【讨论】:

    【解决方案2】:

    想到 Perl 和 awk,虽然 Python 也可以,但如果您不想学习一门新语言。

    Perl 是一种通用语言,而 awk 更面向您所描述的类型的文本处理。

    【讨论】:

    • “每当遇到问题时,总会有人说‘让我们使用 AWK。’”现在,他们有两个问题。” -- D. 蒂尔布鲁克 ;)
    • @ronys,awk 不仅仅用于文本处理。您也可以将其用作编程语言。
    • @ghostdog:这句话流传了 20 年(自 1988 年以来regex.info/blog/2006-09-15/247)。它说明了一些事情。还要注意最后的;) :)
    • 你不觉得它无关紧要和过时吗?从那时起,awk 取得了长足的进步。
    • 你能为 awk 推荐一些好的资源吗?
    【解决方案3】:
    #!/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
    

    【讨论】:

    • perl -lane '$,=" ";pop@F;print@F'perl -lane '$,=" ";print@F[0,1]'
    • @Hynek -Pichi- Vychodil:尝试做一些小实验:向两个都不知道的人展示 Perl 和 Python 版本,并询问他们这些脚本的作用。而且我同意除了 J(用于数学的东西)之外,没有什么比 Perl 的单行代码更简洁了。
    【解决方案4】:

    *nix 工具如awk/grep/tail/head/sed 等是很好的文件处理工具。如果要在文件中搜索模式并处理它们,可以使用 awk。对于大文件,您可以使用 grep+awk 的组合。 Grep 的模式搜索速度和 awk 处理文本的能力。关于 sed,通常 sed 做什么,awk 已经可以做到,所以我发现使用 sed 进行文件处理是多余的。

    就处理文件的速度而言,awk 通常与 Perl 或其他语言相当,有时甚至更好。

    另外,两个非常好的工具可以快速获取文件的前后部分,它们是tailhead。因此,要获取最后一行,您可以使用tail

    【讨论】:

    • 我假设通过“令牌”,OP 表示一行中的项目,而不是文件的行,因此 tail 不适用于这种情况。 cut,另一方面...
    【解决方案5】:

    当然,最好的工具取决于要执行的任务。除了常用的 *nix 工具(如 sed/awk 等)和其他人引用的编程语言(Perl、Python)之外,目前对于我需要的文本处理,原始数据格式不遵循严格的解析规则但可能略有不同,我发现自己非常适合我在 Vim 编辑器中调用的 Vim 宏和 Vimscript 函数。

    类似这样的事情(对于未启动 Vim 的人):您编写处理函数,例如。文件 script.vim 上的 TxtProcessingToBeDone1(),使用 :source script.vim 获取它,然后打开要编辑的文件并:

    :调用 TxtProcessingToBeDone1()

    一次在整个缓冲区上或作为一次性操作在现场使用@: 和@@ 键重复。也可以使用 :bufdo 和 :argdo 同时处理多个缓冲区/文件。

    使用 Vimscript 功能,您可以重复在常规编辑会话中执行的所有任务(搜索模式、正则表达式、替换、移动到、删除、拉取等),自动化它并应用一些编程控制流(if/then)。

    类似的考虑也适用于其他高级脚本编辑器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2015-01-19
      • 1970-01-01
      相关资源
      最近更新 更多