2017-08-31 47 views
2

我需要一些shell腳本的幫助。用shell腳本減去文件中的最小值

我有以下的文本文件(open_calculator [1]):

value:0,0236679
value:0,0272904
value:0,0282416
value:0,0295671
value:0,0318641
value:0,032451
value:0,0333313
value:0,0360229
value:0,0364378

,我需要獲得該文件的最小值和減去同一個文本文件的其他值了。所以,我的輸出應該是:

value:0,0000000
value:0,0036225
value:0,0045737
.
.
.
value: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

這些值是否表示浮點/十進制數? – batMan

+0

是的,這些值是十進制數。 – Nands

回答

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,
value:0,0127699 

解決方案2:一是內膽使用AWKTR只有

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的結果是通過管道傳輸來翻譯「。」到「,」來匹配你想要的輸出。

+0

儘管如此,所需的輸出以冒號分隔,並使用逗號作爲小數點。 –

+0

@BenjaminW .:謝謝指出。讓我修復 – batMan

+1

謝謝,batman。 第二個解決方案工作正常,但我怎樣才能將輸出保存在文件中? – Nands

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使用小數點而不是逗號,所以需要替換。

+0

謝謝,我不知道perl,但現在我將開始學習。 – Nands

相關問題