关于整数加单行,存在几种建议的 shell 脚本解决方案;
然而,仔细观察所选择的每个解决方案,都存在固有的局限性:
awk 那些会以任意精度和整数大小窒息(毕竟它的行为类似于 C)bc 宁愿对任意长的输入不满意: (sed 's/$/+\\/g';echo 0)|bc了解可能存在跨平台的可移植性问题(参见 [1] [2]),这是不受欢迎的,是否有一个通用的解决方案,它在实用性和简洁性上都是赢家?
提示:SunOS 和 MacOSX 是可移植性成为问题的示例。
菲。dc命令可以允许处理任意大的 2^n、整数或其他输入吗?
[1] awk:https : //stackoverflow.com/a/450821/1574494或/sf/answers/1767151781/或在 awk 中打印长整数
[2] bc: Bash 命令对一列数字求和
我正在尝试编写一个命令,它可以提供有关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) #! /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?
对于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)
是否可以添加格式选项,以便只输出一行输出
我有这个代码
codonsnum=$(bc -l <<< "$lengthseq/3")
Run Code Online (Sandbox Code Playgroud)
如何将结果限制为仅3位小数?结果是,例如:2.325234985908723我只想要3位小数.
我有两个文件,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中有效地做到这一点?
我有这个输入文件:
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)
我已经使该代码按字母顺序排序。
我正在用 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) 我只是试图使用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的组合(在不同的地方管道等)无济于事.
任何帮助将不胜感激!
我试图找到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) 从阅读 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)作为输出?或者我需要做一个循环吗?
请帮忙.怎么能做到这一点
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命令.
在循环内部,我有一个变量用于计算,使用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.