关于bash:将剪切操作的输出传递给bc

piping the output of a cut operation to bc

本问题已经有最佳答案,请猛点这里访问。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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列的平均值。在我的头脑中,我首先想到尝试这个:

1
 cut -f3 column_based_file.txt | bc

但这可能会不足为奇地返回第3列中每个项的值。

我知道在线程中有可行的解决方案,比如我可以使用的这个解决方案,但是由于Cut是我在bash中处理基于列的数据的一段时间的首选方法,所以我想知道它是否有可能?也许bc有一些标志,可以一次在一行中读取并存储它们等。

编辑在建议的线程和给出的答案中有一些很好的解决方案。出于好奇,因为我最初是这么想的,有没有人有基于cutbc的解决方案(如果出于某种原因Perl或awk不可用的话?)


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

1
2
    {s += $3 }
END {print"Sum:", s," Avg:", s / FNR}

用命令awk -f sumavg.awk sumavg.csv运行它。

$3是每行的第三个字段,END是一个特殊的模式,它的操作最后执行,FNR给出文件中的行数。