分离浮点量的整数部分和小数部分

in Linux with 0 comment

需求起因:编写脚本获取系统内核版本并进行比较,例如内核 3.16 实际是大于 3.9 的,然而数字比较不能直接比较大小,因此考虑分离浮点数,以便分开比较。

目的:分别获取一个浮点数的整数和小数部分,或者将一个文件的文件名和扩展名拆分开,可以考虑使用 cut 或者 awk 实现。

分离浮点量的整数部分和小数部分有多种方式

第一种:使用 cut 实现

example@kane:/tmp$ num1=3.1415 
example@kane:/tmp$ echo $num1 | cut -d '.' -f1 
3 
example@kane:/tmp$ echo $num1 | cut -d '.' -f2 
1415

第一种:使用 awk 实现

example@kane:/tmp$ echo $num1 | awk -F '.' '{print $1}' 
3 
example@kane:/tmp$ echo $num1 | awk -F '.' '{print $2}' 
1415

第三种:还有一种办法,更加高效和洁简,借助 % 操作符可以轻松将名称部分从“名称.扩展名”这种格式中提取出来

example@kane:/tmp$ echo ${num1%.*} 
3 
example@kane:/tmp$ echo ${num1#*.} 
1415

${VAR%.} 的含义:
从$VAR中删除位于 % 右侧的通配符(在前例中是.
)所匹配的字符串。通配符从右向左进行匹配。
${VAR%%.} 的含义:
从$VAR中删除位于 % 右侧的通配符(在前例中是.
)所匹配的字符串。通配符从右向左进行贪婪匹配(尽可能多的匹配)。
${VAR#.} 的含义:
从$VAR中删除位于 # 右侧的通配符(在前例中是
.)所匹配的字符串。通配符从左向右进行匹配。
${VAR##.} 的含义:
从$VAR中删除位于 # 右侧的通配符(在前例中是
.)所匹配的字符串。通配符从左向右进行贪婪匹配(尽可能多的匹配)。

示例:

example@kane:/tmp$ url=www.ibm.com 
example@kane:/tmp$ echo ${url%.*} 
www.ibm 
example@kane:/tmp$ echo ${url%%.*} 
www 
example@kane:/tmp$ echo ${url#*.} 
ibm.com 
example@kane:/tmp$ echo ${url##*.} 
com

例如可用下面的脚本来批量重命名文件(不考虑文件名有空格的情形),下面的脚本可以批量重命名所有的 jpg、png 。

#!/bin/bash
#filename: batchrename.sh
#Rename jpg and png files
count=1
# maxdepth参数尽量靠前是一个很好的习惯,可以避免find深度查找
for oldName in `find /tmp-maxdepth 1 -iname '*.png' -o -iname '*.jpg' -type f`
do
newName=image-$count.${oldName##*.}
mv $oldName $newName
let count++
done

运行效果如下:

example@kane:/tmp$ find /tmp  -maxdepth 1 -iname '*.png' -o -iname '*.jpg' -type f
/tmp/MyBG1a.jpg
/tmp/V1uBkW4.jpg
/tmp/XXxxzyFr.png
/tmp/A8hB3An8ey.png
/tmp/XXxxeb5t.PNG
example@kane:/tmp$ bash rename.sh
example@kane:/tmp$ find /tmp  -maxdepth 1 -iname '*.png' -o -iname '*.jpg' -type f
/tmp/image-5.PNG
/tmp/image-1.jpg
/tmp/image-2.jpg
/tmp/image-4.png
/tmp/image-3.png

参考链接:Linux: shell拆分浮点数的整数和小数部分 && 拆分文件

回复