我需要一些关于shell脚本的帮助。
我有以下文本文件(open_calculator [1]):
值:0,0236679
值:0,0272904
值:0,0282416
值:0,0295671
值:0,0318641
值:0,032451
值:0,0333313
值:0,0360229
值:0,0364378
我需要获取此文件的最小值并将其减去相同文本文件的其他值。所以我的输出应该是:
值:0,0000000
值:0,0036225
值:0,0045737
。
。
。
价值:0,0127699
为了达到这个目的,我写了这个脚本:
file="open_calculator[1]"
min= cut -f2 -d ":" $file | sort -n | head -1
number=$(grep -o '[0-9],[0-9]*' $file)
resul=$((10#$number - 10#$min))
sed -i 's/value:$number/valor:$resul/' $file
但是当我运行此代码时,我收到此消息错误:
line 6:10#0,0236679: value too great for base (error token is "0236679")
有人可以帮我这个剧本吗?抱歉我的英语不好,这是我第一次写这里。
提前致谢!
答案 0 :(得分:1)
您可以按以下方式修改代码:
tr ',' '.' <open_calculator[1] > file #Converting each , to . to make these numbers decimal
min=`cut -f2 -d ":" file | sort -n | head -1`
awk -F":" -v m=$min '{print $1":"($2-m) } ' file | tr "." ","
输出:
value:0
value:0,0036225
value:0,0045737
value:0,0058992
value:0,0081962
value:0,0087831
value:0,0096634
value:0,012355
value:0,0127699
解决方案2 :仅使用 awk 和 tr 的一个班轮
tr "," "." <open_calculator[1] | awk -F":" 'NR==1{a[NR]=min=$2} {a[NR]=$2; a[NR]<min?min=a[NR]:min; } END{for(i=1;i<NR;i++){print "value:"a[i]-min}}' | tr "." ","
这里我们在awk中找到min并从第二列中减去。来自awk的结果通过管道传输到tr来翻译“。” “,”以匹配您想要的输出。
答案 1 :(得分:0)
bash不处理浮点算术。
Perl救援:
perl -e 'while (<>) {
s/,/./;
($n) = /([0-9.]+)/;
$min = $n unless defined $min && $min < $n;
}
open ARGV, $ARGV;
while (<>) {
s/,/./;
s/([0-9.]+)/$1 - $min/e;
s/\./,/;
print;
}' -- filename
第一个循环找到最小值,然后open
再次重新打开文件,第二个循环减去最小值。由于Perl使用小数点而不是逗号,因此需要替换。