awk“for”语句中的“&&”
Posted
技术标签:
【中文标题】awk“for”语句中的“&&”【英文标题】:"&&" in awk "for" statement 【发布时间】:2015-07-24 04:07:16 【问题描述】:awk -F'\t' 'BEGINOFS="\t"
x[NR]=$1;y[NR]=$2
END
for(m=1;m<=NR;m++)
for(n=m+1;n<=NR && x[m] == x[n];n++)
print NR,m,n,x[m],x[n],y[m],y[n] >> "tmp"
' all_lemma10
awk -F'\t' 'BEGINOFS="\t"
x[NR]=$1;y[NR]=$2
END
for(m=1;m<=NR;m++)
for(n=m+1;n<=NR;n++)
if (x[m]==x[n])
print NR,m,n,x[m],x[n],y[m],y[n] >> "tmp"
' all_lemma10
我对这两个 awk 感到困惑。我认为他们应该得出相同的结果。但事实并非如此。请帮我解释原因。
【问题讨论】:
我强烈怀疑如果你只是在多行上用空格重写它并缩进差异会非常明显。将一个自然多行的脚本塞到一行上只会混淆它,特别是如果你另外去除所有其他空白。 【参考方案1】:在不试图理解令人费解的细节的情况下,让我试着解释一下为什么这两种形式在一般中是不等价的:
for(n=m+1; n<=NR && x[m] == x[n]; n++)
可能停止迭代之前n > NR
,即一旦条件x[m] == x[n]
评估为假。
相比之下,
for(n=m+1; n<=NR; n++) if (x[m] == x[n]) ...
将总是迭代直到n > NR
,并根据x[m] == x[n]
是否为真,对给定的迭代采取行动或不采取行动。
【讨论】:
以上是关于awk“for”语句中的“&&”的主要内容,如果未能解决你的问题,请参考以下文章