使用shell脚本减去文件中的最小值

时间:2017-08-31 19:58:08

标签: bash shell base

我需要一些关于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")

有人可以帮我这个剧本吗?抱歉我的英语不好,这是我第一次写这里。

提前致谢!

2 个答案:

答案 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使用小数点而不是逗号,因此需要替换。