Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将切割操作的输出输送到bc_Bash_Cut_Bc - Fatal编程技术网

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
无法实现解决方案。