【问题标题】:How to output lines longer than a specified number of words in Bash using awk or grep如何使用 awk 或 grep 在 Bash 中输出超过指定字数的行
【发布时间】:2019-08-14 05:18:30
【问题描述】:

我想输出长于指定单词数的行,比如说 5。我使用了awk,如下所示,但它不适用于包含很长句子(超过 32767 个字段)的文件。

awk 'NF>5' FS=" " file.txt

我尝试按照this thread 中的建议使用sedgrep,但我无法根据字数而不是字符数使其工作。

你能帮我解决这个问题吗?非常感谢您的帮助!

【问题讨论】:

  • 没有 GNU awk 是什么意思?您的系统中是否安装了其他任何 awk 变体?
  • 试着用积极而不是消极的方式表达你的需求,这会让它们更容易理解,因此生成的代码更有可能是正确的。而不是I want to remove lines that are shorter than a specified number of words, lets say 5,只需说I want to output lines that are longer than a specified number of words, lets say 4。通过谈论你想输出什么而不是你想从输出中删除什么,你的需求和限制变得更加清晰。
  • 另外 - 安装 gawk 是您的问题的一种潜在解决方案,但这不是您的问题,所以它不应该成为您问题的重要部分。您真正的问题应该是“当我在系统 Z 上只有 Y awk 可用时,我该怎么做 X”。您的 awk 可能与您正在使用的系统上已经可用的 awk 不同(例如 Solaris 有 3 个 awk 变体),但您没有告诉我们有关您正在使用的 awk 或您所在的系统的任何信息,只是你不能安装 gawk。
  • @EdMorton 哦,我现在刚刚阅读了您的 cmets。非常感谢您的宝贵建议!我将编辑我的问题并注意使我未来的问题更清晰和重点。

标签: awk grep


【解决方案1】:
awk '/([^[:space:]]+[[:space:]]+){4}[^[:space:]]/' file

【讨论】:

  • 谢谢!它也能正常工作,并且比使用grep 的解决方案快一点。我接受了以前的解决方案,所以我赞成你的回答。
  • @oguzismail 我认为没关系。时差是微不足道的。在我发布问题后,您很快就回答了,这为我节省了很多时间陷入困境。再次非常感谢您! :)
【解决方案2】:
grep '\([^[:space:]]\{1,\}\([[:space:]]\{1,\}\|$\)\)\{5,\}' file

或者如果你的 grep 有 -E:

grep -E '([^[:space:]]+([[:space:]]+|$)){5,}' file

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 2018-03-27
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2016-07-09
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多