使用 shell 脚本减去文件中的最小值
subtracting the minimum value in a file with shell script
我需要一些关于 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")
有人可以帮我写这个脚本吗?对不起我的英语不好,这是我第一次在这里写。
提前致谢!
bash 不处理浮点运算。
Perl 来拯救:
perl -e 'while (<>) {
s/,/./;
($n) = /([0-9.]+)/;
$min = $n unless defined $min && $min < $n;
}
open ARGV, $ARGV;
while (<>) {
s/,/./;
s/([0-9.]+)/ - $min/e;
s/\./,/;
print;
}' -- filename
第一个循环找到最小值,然后open
再次重新打开文件,第二个循环减去最小值。需要替换,因为 Perl 使用小数点,而不是逗号。
您可以修改您的代码如下:
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 ":"(-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=} {a[NR]=; a[NR]<min?min=a[NR]:min; } END{for(i=1;i<NR;i++){print "value:"a[i]-min}}' | tr "." ","
这里我们在 awk 本身中找到 min 并从第二列中减去。 awk 的结果通过管道传输到 tr 以翻译“.”。到“,”以匹配您想要的输出。
我需要一些关于 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")
有人可以帮我写这个脚本吗?对不起我的英语不好,这是我第一次在这里写。
提前致谢!
bash 不处理浮点运算。
Perl 来拯救:
perl -e 'while (<>) {
s/,/./;
($n) = /([0-9.]+)/;
$min = $n unless defined $min && $min < $n;
}
open ARGV, $ARGV;
while (<>) {
s/,/./;
s/([0-9.]+)/ - $min/e;
s/\./,/;
print;
}' -- filename
第一个循环找到最小值,然后open
再次重新打开文件,第二个循环减去最小值。需要替换,因为 Perl 使用小数点,而不是逗号。
您可以修改您的代码如下:
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 ":"(-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=} {a[NR]=; a[NR]<min?min=a[NR]:min; } END{for(i=1;i<NR;i++){print "value:"a[i]-min}}' | tr "." ","
这里我们在 awk 本身中找到 min 并从第二列中减去。 awk 的结果通过管道传输到 tr 以翻译“.”。到“,”以匹配您想要的输出。