0

示例代码是这样的,它对第一列出现的次数进行统计并对结果进行排序。

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

在我看来,这个过程是这样的:

(工作流程 A)

1) 打印 中的所有元素dist,将它们全部保存到缓冲区

2)获取缓冲区中的所有元素,并将它们通过管道传递给sort函数

但在上面的示例中,过程如下所示:

(工作流程 B)

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

第二种方式不能这样做的原因是因为| "command"它是 awkprint命令语法的一部分,它不能与任意语句或语句组一起使用。同样的事情也适用> filename

它的工作方式是,当它第一次遇到到文件或管道的重定向时,它会打开该文件/管道,并保持该描述符打开。然后每次重定向到同一个文件/管道时,它都会将输出发送到相应的描述符。

于 2012-10-22T04:06:22.697 回答
0

请参阅@barmar 对“为什么不”的回答,以及如何获得该功能(在循环结束时调用排序)来解决问题的第二部分:

    { 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 回答