0

サンプルコードは次のようになり、最初の列が表示された回数の統計を実行し、結果を並べ替えます。

    { dist[$1]+=1; }
END { for (i in dist) {
        print i,dist[i] | "sort"
      }
    }

私の意見では、プロセスは次のようになります。

(ワークフローA)

1)内のすべての要素を出力しdist、それらすべてをバッファに保存します

2)バッファ内のすべての要素を取得し、それらをパイプしてsort機能させる

ただし、上記の例では、プロセスは次のようになります。

(ワークフローB)

1)に1つの要素を出力しdist、それをパイプしてsort機能させる

2)distの新しい要素がなくなるまで、の次の要素を処理しますdist

私はなぜ私がsortこのようなものを置くべきではないのか疑問に思いました:

    { dist[$1]+=1; }
END { for (i in dist) {
        print i,dist[i] 
      } 
      | "sort"
    }

誰かがその理由について何か考えがありますか?そして、pipe私がそのような仕事をしたいのであれば、どうすれば書くことができWORKFLOW Bますか?

ありがとう!

4

2 に答える 2

3

2 番目の方法で実行できない理由は| "command"、 awk のprintコマンドの構文の一部であり、任意のステートメントまたはステートメント グループでは使用できないためです。についても同様です> filename

その仕組みは、ファイルまたはパイプへのリダイレクトに初めて遭遇したときに、そのファイル/パイプを開き、その記述子を開いたままにするというものです。次に、同じファイル/パイプにリダイレクトするたびに、出力を対応する記述子に送信します。

于 2012-10-22T04:06:22.697 に答える
0

「理由」については@barmarの回答を参照してください。質問の2番目の部分に対処するために、その機能を取得する方法(ループの最後で並べ替えを呼び出す方法)は次のとおりです。

    { dist[$1]+=1; }
END { for (i in dist) {
        out = out i OFS dist[i] ORS 
      } 
      printf "%s",out | "sort"
    }
于 2012-10-22T12:39:27.240 に答える