2012-10-22 58 views
0

示例代碼如下所示,它對第一列出現的次數進行統計並對結果進行排序。AWK中管道語法的混淆

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

在我看來,這個過程是這樣的:

(工作流)

1)打印在dist所有元素,將它們保存到緩衝區

2)獲取緩衝區中的所有元素,並將它們傳送到sort函數

但是在上面的例子,該過程是這樣的:

(WORKFLOW B)

1)在dist打印一個元件,然後通過管道它sort功能

2)處理中的下一個元素在dist,直到dist

沒有新的元素,我想知道爲什麼我不應該把sort這樣的:

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

任何人有任何想法的原因?如果我想完成像WORKFLOW B這樣的工作,我該如何編寫pipe

謝謝!

回答

3

你不能這樣做的原因第二種方式是因爲| "command"是awk的print命令語法的一部分,所以它不能用於任意語句或語句組。 > filename也是一樣的。

它的工作方式是,它第一次遇到重定向到文件或管道,它打開該文件/管道,並保持該描述符打開。然後每次重定向到相同的文件/管道時,它將輸出發送到相應的描述符。

0

見@ barmar的回答爲「爲什麼不」,和這裏的如何獲取該功能(在循環結束排序調用)來解決你問題的第二部分:

{ dist[$1]+=1; } 
END { for (i in dist) { 
     out = out i OFS dist[i] ORS 
     } 
     printf "%s",out | "sort" 
    }