将 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
有一些标志用于一次读取一行并存储它们等
编辑 建议的主题和给出的答案中有一些很好的解决方案。出于好奇,因为这就是我最初的想法,有没有人有基于 cut
和 bc
的解决方案(如果由于某种原因 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
给出了文件中的行数。
是否有可能让 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
有一些标志用于一次读取一行并存储它们等
编辑 建议的主题和给出的答案中有一些很好的解决方案。出于好奇,因为这就是我最初的想法,有没有人有基于 cut
和 bc
的解决方案(如果由于某种原因 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
给出了文件中的行数。