【问题标题】:AWK Line of code printing to my output file when no print has been stated未声明打印时,AWK 代码行打印到我的输出文件
【发布时间】:2018-01-23 23:33:27
【问题描述】:

我打算将一组字符匹配到单词的中间,在那里我检查单词的开头和结尾(它不能匹配第一个或最后一个字符,否则我的目标是无效的)。然后我检查它是否存在于单词中使用

$1~/xampl/

我想出的代码行完美运行,除了使用时

awk -f awkfile inputfile > outputfile

我希望它增加存在而不打印,但每次匹配时都会打印...我错过了什么吗?

【问题讨论】:

  • 我无法在此处重现该行为;也许您的 awk 脚本的不同部分正在执行此操作?

标签: regex linux awk


【解决方案1】:

awk 程序遵循这种结构:

CONDITION { ACTIONS } [ CONDITION { ACTIIONS } ... ]

其中 CONDITION 或 ACTIONS 是可选的。如果缺少 CONDITION,如下所示:

awk '{ print }'

awk 将假定 CONDITION 为 true 并在每一行输入上执行 { print }

如果缺少 ACTIONS,就像这样(类似于您的情况):

awk '$1~/xampl/'

awk 将运行 默认操作,即{print}。如果您不想打印而只是增加,则需要添加一个操作,如下所示:

awk '$1~/xampl/ { c++ }'

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,那么您仅在单词出现在第一个字段的中间时才匹配该单词的表达是错误的。您的后缀索引减少了两个;应该是:

    #!/usr/bin/awk -f
    "xampl"!=substr($1, 1, length("xampl")) && "xampl"!=substr($1, length($1)-length("xampl")+1, length("xampl")) && $1~/xampl/ {exists+=1}
    

    其中可以缩短为:

    #!/usr/bin/awk -f
    $1~/.+xampl.+/ {exists++}
    

    但是,这些脚本没有副作用,即您所做的只是增加一个变量,但您从不打印它。这让我相信你的错误实际上是在你没有向我们展示的脚本的其他部分。无论如何,您的 awk 程序在从文件调用时不应该有不同的行为。

    【讨论】:

      最近更新 更多