代码之家  ›  专栏  ›  技术社区  ›  Nands

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

  •  2
  • Nands  · 技术社区  · 7 年前

    我需要一些关于shell脚本的帮助。

    值:00236679

    值:00282416
    值:00295671
    值:00318641

    值:00333313

    值:00364378

    我需要得到这个文件的最小值,然后用它减去同一个文本文件的其他值。所以我的输出应该是:


    值:00036225
    值:00045737

    .
    .

    为了实现这一点,我编写了以下脚本:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Rahul Verma    7 年前

    您可以按以下方式修改代码:

    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 :一个衬里使用 只有

    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 "." ","
    

        2
  •  0
  •   choroba    7 年前

    bash不处理浮点算术。

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