【问题标题】:"&&" in awk "for" statementawk“for”语句中的“&&”
【发布时间】:2015-07-24 04:07:16
【问题描述】:
awk -F'\t' 'BEGIN{OFS="\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' 'BEGIN{OFS="\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 感到困惑。我认为他们应该得出相同的结果。但事实并非如此。请帮我解释原因。

【问题讨论】:

  • 我强烈怀疑如果你只是在多行上用空格重写它并缩进差异会非常明显。将一个自然多行的脚本塞到一行上只会混淆它,特别是如果你另外去除所有其他空白。

标签: shell awk


【解决方案1】:

在不试图理解令人费解的细节的情况下,让我试着解释一下为什么这两种形式在一般中是不等价的:

for(n=m+1; n<=NR && x[m] == x[n]; n++) 

可能停止迭代之前n &gt; NR,即一旦条件x[m] == x[n]评估为假。

相比之下,

for(n=m+1; n<=NR; n++) {if (x[m] == x[n]) ... }

总是迭代直到n &gt; NR,并根据x[m] == x[n] 是否为真,对给定的迭代采取行动或不采取行动。

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多