Bash 将切割操作的输出输送到bc
是否有可能根据Bash 将切割操作的输出输送到bc,bash,cut,bc,Bash,Cut,Bc,是否有可能根据cut命令的输出获得bc进行计算 假设我有以下基于列的文件: 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 * *
cut
命令的输出获得bc
进行计算
假设我有以下基于列的文件:
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 * *
我希望能够对某些字段执行一些计算,例如对第三列求和/或求平均值。在我的脑海中,我首先想到的是:
cut -f3 column_based_file.txt | bc
但这可能会返回第3列中每个项目的值,这并不奇怪
我知道在线程中有一些可行的解决方案,比如我可以使用的解决方案,但是由于cut已经是我在bash中处理基于列的数据的常用方法,我只是想知道它是否有可能?也许bc
有一些标志,用于一次读取一行并存储它们等
编辑在建议的线程和给出的答案中有一些很好的解决方案。出于好奇,既然我最初就是这么想的,那么有人有基于
cut
和bc
的解决方案吗(如果出于某种原因perl或awk可能不可用?我会使用awk。依我之见,它更适合这项任务。假设您的数据存储在sumavg.csv
,则此GNU awk脚本(sumavg.awk
)显示第三个字段的总和和平均值:
{s += $3 }
END {print "Sum:", s, " Avg: ", s / FNR}
使用命令awk-f sumavg.awk sumavg.csv
运行它
$3
是每行的第三个字段,END
是一种特殊模式,它的操作在末尾执行,FNR
给出文件中的行数。我会使用awk。依我之见,它更适合这项任务。假设您的数据存储在sumavg.csv
,则此GNU awk脚本(sumavg.awk
)显示第三个字段的总和和平均值:
{s += $3 }
END {print "Sum:", s, " Avg: ", s / FNR}
使用命令awk-f sumavg.awk sumavg.csv
运行它
$3
是每行的第三个字段,END
是一个特殊的模式,它的操作在最后执行,FNR
给出文件中的行数。啊,这太好了!我真的从来没有适当的理由去处理awk
,但我怀疑我应该尽早这样做,而不是迟些…如果我想让awk脚本在输出中打印文件名,我该如何实现呢?使用` END{print'文件是:“$3”等..}会引发语法错误。基于其他线程,我无法找出我做错了什么。在结尾部分使用打印文件名,“Sum:”,s,“Avg:”,s/FNR
。啊,这太好了!我真的从来没有适当的理由去处理awk
,但我怀疑我应该尽早这样做,而不是迟些…如果我想让awk脚本在输出中打印文件名,我该如何实现呢?使用` END{print'文件是:“$3”等..}会引发语法错误。基于其他线程,我无法找出我做错了什么。在结尾部分使用print FILENAME,“Sum:,s,“Avg:,s/FNR
。请看:啊,太好了,当我通过cut
和bc
关键字查看时,没有遇到这个问题。Sum=$(sed-r“s/+/\t/g”sumavg.csv | cut-f3 | paste-s-d+-bc)
用于计算总和。(我需要sed步骤将空间序列压缩到一个选项卡中)和lc=$(wc-l sumavg.csv | cut-f1-d“”)
进行行计数(注意最后一行数据以换行符结尾),然后输出:echo$sum
和echo“scale=3;$sum/$lc”| bc
用于average@JoeHealey:我应该重新开始这个问题吗?不,我认为结束是有效的@Cyrus,Lars解决方案很有趣,但证实了我的猜测,即在不调用任何其他程序的情况下,仅使用cut
和bc
无法实现解决方案。请参阅:啊,太好了,当我通过cut
和bc
关键字查看时,没有遇到这个问题。sum=$(sed-r“s/+/\t/g”sumavg.csv | cut-f3 | paste-s-d+-| bc)
用于求和。(我需要sed步骤将空间序列压缩到一个选项卡中)和lc=$(wc-l sumavg.csv | cut-f1-d“”)
进行行计数(注意最后一行数据以换行符结尾),然后输出:echo$sum
和echo“scale=3;$sum/$lc”| bc
用于average@JoeHealey:我应该重新开始这个问题吗?不,我认为结束是有效的@Cyrus,Lars解决方案很有趣,但证实了我的猜测,即在不调用任何其他程序的情况下,仅使用cut
和bc
无法实现解决方案。