【问题标题】:Confusion of pipe syntax in AWKAWK 中管道语法的混淆
【发布时间】:2012-10-22 02:55:34
【问题描述】:

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

    { 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"
    }

有人知道原因吗?如果我想做WORKFLOW B 这样的工作,我该如何写pipe

谢谢!

【问题讨论】:

    标签: shell awk pipe


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-02-13
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 2015-07-02
        • 2019-11-29
        • 2021-09-03
        相关资源
        最近更新 更多