当没有声明打印时,AWK代码行打印到我的输出文件

时间:2017-08-15 23:51:03

标签: regex linux awk

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

的单词中
$1~/xampl/

我提出的代码行完美无缺,除非使用

awk -f awkfile inputfile > outputfile

理想情况下,只是希望它增加存在而不是打印,但每次匹配时都会打印...我错过了什么?

2 个答案:

答案 0 :(得分:1)

awk程序遵循以下结构:

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

其中CONDITION或ACTIONS是可选的。如果缺少CONDITION,请执行以下操作:

awk '{ print }'

awk将假设条件为true并在每一行输入上执行{ print }

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

awk '$1~/xampl/'

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

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

答案 1 :(得分:0)

如果我正确理解了你的问题,你的表达只有当它出现在第一个字段的中间时才匹配单词是错误的。你的后缀索引是两个;它应该是:

#!/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程序的行为应该不同。