标签: bc

最优雅的 unix shell 单行来求和任意精度的数字列表?

关于整数加单行,存在几种建议的 shell 脚本解决方案;
然而,仔细观察所选择的每个解决方案,都存在固有的局限性:

  • awk 那些会以任意精度和整数大小窒息(毕竟它的行为类似于 C)
  • bc 宁愿对任意长的输入不满意: (sed 's/$/+\\/g';echo 0)|bc

了解可能存在跨平台的可移植性问题(参见 [1] [2]),这是不受欢迎的,是否有一个通用的解决方案,它在实用性简洁性上都是赢家?

提示:SunOS 和 MacOSX 是可移植性成为问题的示例。
菲。dc命令可以允许处理任意大的 2^n、整数或其他输入吗?

[1] awkhttps : //stackoverflow.com/a/450821/1574494/sf/answers/1767151781/在 awk 中打印长整数

[2] bc: Bash 命令对一列数字求和

shell scripting awk bc dc

3
推荐指数
1
解决办法
859
查看次数

将perl的一部分传递给bc

我正在尝试编写一个命令,它可以提供有关linux系统的一些信息.命令应该是一个班轮.它应该代表中断,进程和上下文切换的总量.

我对linux世界很陌生,所以这对我来说并不容易.到目前为止,我发现了这个:

cat /proc/stat | grep -E 'ctxt|intr|processes' | \
 perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}'
Run Code Online (Sandbox Code Playgroud)

问题出在最后一部分,其他部分.我并没有在价值1美元的情况下,但我应该知道1美元的物品总和.

$ 1应包含以下内容:

8522774 17 6 0 0 0 0 2 0 1 0 1435117 21 103 0 84742 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 …
Run Code Online (Sandbox Code Playgroud)

linux perl replace bc

2
推荐指数
1
解决办法
159
查看次数

shell脚本,其中bc失去精度

#! /bin/sh
a1=260
a2=9150
echo "$a1 * 100 / $a2" | bc
Run Code Online (Sandbox Code Playgroud)

输出是

2
Run Code Online (Sandbox Code Playgroud)

它应该在哪里

2.8415
Run Code Online (Sandbox Code Playgroud)

虽然我正在使用,为什么精度会丢失bc

math shell bc

2
推荐指数
1
解决办法
2514
查看次数

unix`bc`实用程序的格式输出

对于bcunix中的大输出实用程序,以这种格式提供输出:

  $ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.     
    2^1000
    10715086071862673209484250490600018105614048117055336074437503883703\ 
    51051124936122493198378815695858127594672917553146825187145285692314\ 
    04359845775746985748039345677748242309854210746050623711418779541821\ 
    53046474983581941267398767559165543946077062914571196477686542167660\    
    429831652624386837205668069376
Run Code Online (Sandbox Code Playgroud)

是否可以添加格式选项,以便只输出一行输出

unix bc

2
推荐指数
1
解决办法
424
查看次数

限制bc中的小数位数

我有这个代码

codonsnum=$(bc -l <<< "$lengthseq/3")
Run Code Online (Sandbox Code Playgroud)

如何将结果限制为仅3位小数?结果是,例如:2.325234985908723我只想要3位小数.

bash bc

2
推荐指数
1
解决办法
256
查看次数

减去相应的行

我有两个文件,file1.csv

3 1009
7 1012
2 1013
8 1014
Run Code Online (Sandbox Code Playgroud)

和file2.csv

5 1009
3 1010
1 1013
Run Code Online (Sandbox Code Playgroud)

在shell中,我想根据第二列中的标识符,从第一个文件中减去第二个文件中第一列中的计数.如果第二列中缺少标识符,则假定计数为0.

结果将是

-2 1009
-3 1010 
7 1012
1 1013
8 1014
Run Code Online (Sandbox Code Playgroud)

文件很大(几GB).第二列已排序.

我如何在shell中有效地做到这一点?

csv shell awk sed bc

2
推荐指数
1
解决办法
306
查看次数

如何使用awk打印浮点数

我有这个输入文件:

Adrian 20.6
Bruce 40.2
Adrian 30.4
Janick 24.2
Dave 42.7
Bruce 42.9
Janick 41.2
Run Code Online (Sandbox Code Playgroud)

通过我在这里得到的答案,我能够对数字求和,但现在数字是浮点数,我不知道如何打印它们。

现在,我的输出是:

Adrian 50
Bruce 82
Dave 42
Janick 65
Run Code Online (Sandbox Code Playgroud)

但它也应该带有小数。

$(awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' $arq > temp.txt && sort temp.txt)
Run Code Online (Sandbox Code Playgroud)

我已经使该代码按字母顺序排序。

sorting shell awk bc

2
推荐指数
1
解决办法
56
查看次数

awk 和 bc 哪一种对于浮点运算更有效?

我正在用 bash 编写一个系统性能脚本。我想以百分比形式计算 CPU 使用率。我有两种实现,一种使用 awk,另一种使用 bc。我想知道这两个版本哪个更有效。使用 awk 还是 bc 进行浮点计算更好?谢谢!

版本 #1(使用 bc)

CPU=$(mpstat 1 1 | grep "Average" | awk '{print $11}')
CPU=$(echo "scale=2;(100-$CPU)" | bc -l)
echo $CPU
Run Code Online (Sandbox Code Playgroud)

版本#2(使用 awk)

CPU=$(mpstat 1 1 | grep "Average" | awk '{idle = $11} {print 100 - idle}')
echo $CPU
Run Code Online (Sandbox Code Playgroud)

linux bash performance awk bc

1
推荐指数
1
解决办法
1802
查看次数

在shell脚本中正确使用bc?

我只是试图使用bc乘以一些浮点变量:

#!/bin/bash

a=2.77 | bc
b=2.0  | bc

for cc in $(seq 0. 0.001 0.02)
do
    c=${cc} | bc
    d=$((a * b * c)) | bc
    echo "$d" | bc
done
Run Code Online (Sandbox Code Playgroud)

这不会给我一个输出.我知道这是一个愚蠢的,但我已经尝试了一些bc的组合(在不同的地方管道等)无济于事.

任何帮助将不胜感激!

math bash shell bc

1
推荐指数
1
解决办法
1257
查看次数

bc(standard_in)1:语法错误

我试图找到myfunc可执行文件中的位置:

#include <stdio.h>

void myfunc(){
    printf("Hello");
}

int main(){

}
Run Code Online (Sandbox Code Playgroud)

我写了这个脚本:

#!/bin/bash -x
start=$(nm -S a.out|grep -w _start)
start_addr=$(echo $start | awk '{print $1}')
myfun=$(nm -S a.out|grep $1)
myfun_addr=$(echo $myfun | awk '{print $1}')
myfun_length=$(echo $myfun | awk '{print $2}')
echo $myfun_length
myfun_end=$(echo "obase=16;ibase=16;$myfun_addr + $myfun_length" | bc)
offset=$(echo "obase=16;ibase=16;$myfun_addr - $start_addr" | bc)
Run Code Online (Sandbox Code Playgroud)

最后一行运行,但前面的行没有:

++ echo 'obase=16;ibase=16;0000000000400900 + 00000000000000bc'
++ bc
(standard_in) 1: syntax error
+ myfun_end=
++ echo 'obase=16;ibase=16;0000000000400900 - 0000000000400710'
++ bc
+ offset=1F0
Run Code Online (Sandbox Code Playgroud)

c bash shell bc

1
推荐指数
1
解决办法
2326
查看次数

使用 bc 对数组进行 bash 操作

从阅读 bc 的手册页来看,BC 似乎可以接受简单变量,也可以接受数组作为输入。

但是,如果我尝试添加两个数组,我只会得到一个元素作为输出

a=(1 2 3)
b=(10 11 12)
c=`echo "$a + $b" | bc`
Run Code Online (Sandbox Code Playgroud)

那么c只包含11。是否有办法让bc对数组中的所有元素进行操作以产生(11 13 15)作为输出?或者我需要做一个循环吗?

bash bc

1
推荐指数
1
解决办法
1014
查看次数

BASH没有bc :: if [echo`awk'BEGIN {print 0.001> 0.9}'-eq 0]; 然后做一些事情; 科幻

请帮忙.怎么能做到这一点

if [ echo `awk 'BEGIN{print 0.001>0.9}'` -eq 0 ]; then DO SOMETHING; fi
Run Code Online (Sandbox Code Playgroud)

但这是错误的.
我要做的是:如果第一个数字(0.001)如果大于0.9,那么DO SOMETHING.否则没有
数字将始终浮动,如0.001,0.03,0.89等......
啊,我不能使用bc命令.

bash shell awk if-statement bc

0
推荐指数
1
解决办法
243
查看次数

如何在for循环中使用bc

在循环内部,我有一个变量用于计算,使用bc另一个变量.但是,我得到的结果是完全错误的.我有32个文件,名称test0,test1等等.我的脚本如下:

for i in {0..31}; do
  declare x$i=$(wc -l < test$i)
  declare y$i=$(echo $x$i/10 | bc) 
done
Run Code Online (Sandbox Code Playgroud)

对于变量x,我得到了好的结果,即每个都x$i存储了对应的行数test$i.然后我想简单地知道每个10%的多少x$i并将其存储在变量中y$i.而且,正如我上面所说,使用该脚本我得到了完全错误的结果.例如,对于x0= 155287510,我得到了y0= 20.

bash for-loop bc

0
推荐指数
1
解决办法
329
查看次数

标签 统计

bc ×13

bash ×7

shell ×7

awk ×5

linux ×2

math ×2

c ×1

csv ×1

dc ×1

for-loop ×1

if-statement ×1

performance ×1

perl ×1

replace ×1

scripting ×1

sed ×1

sorting ×1

unix ×1