将 cut 操作的输出管道传输到 bc

piping the output of a cut operation to bc

是否有可能让 bc 根据 cut 命令的输出进行计算?

假设我有基于以下列的文件:

PAK_01896       PAU_03392       75.8    149     32      1       1       145     1       149     *       *
PAK_02014       PAU_03392       69.8    149     45      0       1       149     1       149     *       *
PAU_02074       PAU_03392       77.2    149     30      1       1       145     1       149     *       *
PAU_02206       PAU_03392       69.1    149     46      0       1       149     1       149     *       *
PAU_02775       PAU_03392       79.2    149     31      0       1       149     1       149     *       *
PAK_02606       PAU_03392       78.5    149     32      0       1       149     1       149     *       *
PAU_01961       PAU_03392       67.1    149     49      0       1       149     1       149     *       *
PAK_03203       PAU_03392       95.3    149     7       0       1       149     1       149     *       *
PLT_01716       PAU_03392       76.5    149     35      0       1       149     1       149     *       *
PLT_01758       PAU_03392       79.2    149     31      0       1       149     1       149     *       *
PAU_03392       PAU_03392       100.0   149     0       0       1       149     1       149     *       *
PLT_01696       PAU_03392       78.5    149     32      0       1       149     1       149     *       *
PLT_02424       PAU_03392       78.5    149     32      0       1       149     1       149     *       *
PLT_01736       PAU_03392       77.2    149     34      0       1       149     1       149     *       *
PLT_02568       PAU_03392       67.1    149     49      0       1       149     1       149     *       *
PAK_01787       PAU_03392       66.4    149     50      0       1       149     1       149     *       *

我希望能够对某些字段执行一些计算,例如对第 3 列求和 and/or 的平均值。在我的脑海里,我首先想到尝试这个:

 cut -f3 column_based_file.txt | bc

但也许不足为奇的是,这只是 returns 第 3 列中每个项目的值。

我知道在我可以使用的 this one 等线程中有可行的解决方案,但由于 cut 一直是我在 bash 中操作基于列的数据的首选方法同时,我只是想知道这是否可能?也许 bc 有一些标志用于一次读取一行并存储它们等

编辑 建议的主题和给出的答案中有一些很好的解决方案。出于好奇,因为这就是我最初的想法,有没有人有基于 cutbc 的解决方案(如果由于某种原因 perl 或 awk 可能不可用?)

我会用awk。在我看来,它更适合这项任务。假设您的数据存储在 sumavg.csv 中,那么这个 GNU awk 脚本 (sumavg.awk) 显示第三个字段的总和和平均值:

    {s +=  }
END {print "Sum:", s, " Avg: ", s / FNR}

运行 它与命令 awk -f sumavg.awk sumavg.csv.

</code>是每行的第三个字段,<code>END是一个特殊的模式,它的动作最后执行,FNR给出了文件中的行数。