免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3892 | 回复: 15
打印 上一主题 下一主题

[数值计算] 求助一个脚本的简化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-03 11:15 |只看该作者 |倒序浏览
本帖最后由 zhjwlgh01 于 2016-06-03 11:15 编辑

求大神帮忙简化一个脚本,我写的实在太丑了。。。这个是关于数值转化的,例如有一个数字是  0,0,255, 先将三个数字转成二进制的,不足八位的补成八位,得到00000000,00000000,11111111。 然后第一个数取高五位,第二个取高六位,第三个取高五位,得到00000,000000,11111. 再拼接在一起,得到0000000000011111. 最后分成4份,每份4个数,再转成十六进制的。我写的脚本如下,请大神帮忙修改的简单一点。
#!/bin/sh

Usage()
{
        echo "Error Usage"
        echo "./565_color_key.sh ./1.txt"
        echo ""
}

if [ ! -e $1 ]; then
        Usage
fi
#count the number of rows
CH=` awk '{print NR}' $1 | tail -n1`


for ((i=1; i<$CH ; i=$i+1))
do
        A1=`cat $1 | sed -n "$i"p | awk -F "," '{print $1}'`
        A2=`cat $1 | sed -n "$i"p | awk -F "," '{print $2}'`
        A3=`cat $1 | sed -n "$i"p | awk -F "," '{print $3}'`
        B1=`echo "obase=2;$A1"|bc`
        B2=`echo "obase=2;$A2"|bc`
        B3=`echo "obase=2;$A3"|bc`
        C1=`echo $B1 | awk '{print length($0)}'`
        C2=`echo $B2 | awk '{print length($0)}'`
        C3=`echo $B3 | awk '{print length($0)}'`
        if [ $C1 -eq 1 ]; then
                D1=`echo 0000000$B1 | cut -b 1-5`
        elif [ $C1 -eq 2 ]; then
                D1=`echo 000000$B1 | cut -b 1-5`
        elif [ $C1 -eq 3 ]; then
                D1=`echo 00000$B1 | cut -b 1-5`
        elif [ $C1 -eq 4 ]; then
                D1=`echo 0000$B1 | cut -b 1-5`
        elif [ $C1 -eq 5 ]; then
                D1=`echo 000$B1 | cut -b 1-5`
        elif [ $C1 -eq 6 ]; then
                D1=`echo 00$B1 | cut -b 1-5`
        elif [ $C1 -eq 7 ]; then
                D1=`echo 0$B1 | cut -b 1-5`
        else
                D1=`echo $B1 | cut -b 1-5`
        fi

        if [ $C2 -eq 1 ]; then
                D2=`echo 0000000$B2 | cut -b 1-6`
        elif [ $C2 -eq 2 ]; then
                D2=`echo 000000$B2 | cut -b 1-6`
        elif [ $C2 -eq 3 ]; then
                D2=`echo 00000$B2 | cut -b 1-6`
        elif [ $C2 -eq 4 ]; then
                D2=`echo 0000$B2 | cut -b 1-6`
        elif [ $C2 -eq 5 ]; then
                D2=`echo 000$B2 | cut -b 1-6`
        elif [ $C2 -eq 6 ]; then
                D2=`echo 00$B2 | cut -b 1-6`
        elif [ $C2 -eq 7 ]; then
                D2=`echo 0$B2 | cut -b 1-6`
        else
                D2=`echo $B2 | cut -b 1-6`
        fi

        if [ $C3 -eq 1 ]; then
                D3=`echo 0000000$B3 | cut -b 1-5`
        elif [ $C3 -eq 2 ]; then
                D3=`echo 000000$B3 | cut -b 1-5`
        elif [ $C3 -eq 3 ]; then
                D3=`echo 00000$B3 | cut -b 1-5`
        elif [ $C3 -eq 4 ]; then
                D3=`echo 0000$B3 | cut -b 1-5`
        elif [ $C3 -eq 5 ]; then
                D3=`echo 000$B3 | cut -b 1-5`
        elif [ $C3 -eq 6 ]; then
                D3=`echo 00$B3 | cut -b 1-5`
        elif [ $C3 -eq 7 ]; then
                D3=`echo 0$B3 | cut -b 1-5`
        else
                D3=`echo $B3 | cut -b 1-5`
        fi       

        E=$D1$D2$D3
        F1=`echo $E | cut -b 1-4`
        G1=`echo "obase=16; ibase=2; $F1" | bc`
        F2=`echo $E | cut -b 5-8`
        G2=`echo "obase=16; ibase=2; $F2" | bc`
        F3=`echo $E | cut -b 9-12`
        G3=`echo "obase=16; ibase=2; $F3" | bc`
        F4=`echo $E | cut -b 13-16`
        G4=`echo "obase=16; ibase=2; $F4" | bc`
        H=0x$G1$G2$G3$G4
       
        echo $H >> ./565_color_key.txt
done

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
2 [报告]
发表于 2016-06-03 11:27 |只看该作者
例如有一个数字是  0,0,255  这句话怎么理解?这里不是三个数吗?

论坛徽章:
0
3 [报告]
发表于 2016-06-03 11:29 |只看该作者
不好意思,是有一行,不是有一个数字。。。我就是需要把这三个数字最终处理成一个十六进制的数

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
4 [报告]
发表于 2016-06-03 11:41 |只看该作者
本帖最后由 reyleon 于 2016-06-03 11:43 编辑
  1. #!/bin/bash

  2. if [ $# -ne 3 ];then
  3.     echo "Usage: sh $0 [num1] [num2] [num3]"
  4.     exit 1
  5. fi

  6. to2() {
  7.     printf "%08d" $(echo "obase=2;$1" | bc )
  8. }

  9. to16() {
  10.     echo "obase=16;ibase=2;$1" | bc
  11. }

  12. a1=$(to2 $1)
  13. a2=$(to2 $2)
  14. a3=$(to2 $3)

  15. rs=${a1:0:5}${a2:0:6}${a3:0:5}
  16. for n in $(echo ${rs} | fold -4 );do
  17.     s+=$(to16 $n)
  18. done

  19. echo $s
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
5 [报告]
发表于 2016-06-03 11:50 |只看该作者
本帖最后由 liion631818 于 2016-06-03 12:38 编辑
  1. num1=$(printf "%08d\n" `echo "obase=2;0"|bc`)
  2. num2=$(printf "%08d\n" `echo "obase=2;0"|bc`)
  3. num3=$(printf "%08d\n" `echo "obase=2;255"|bc`)

  4. echo ${num1:0:5}${num2:0:6}${num3:0:5}
  5. echo "obase=16;ibase=2;${num1:0:5}${num2:0:6}${num3:0:5}" | bc
  6. printf "%04X\n" $((2#${num1:0:5}${num2:0:6}${num3:0:5}))

复制代码
回复 1# zhjwlgh01


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2016-06-03 12:03 |只看该作者
回复 1# zhjwlgh01


>> 例如有一个数字是  0,0,255, 先将三个数字转成二进制的 ... 得到00000000,00000000,11111111。
>> 然后第一个数取高五位第二个取高六位,第三个取高五位,得到00000,000000,11111. 再拼接在一起,
>> 得到0000000000011111. 最后分成4份,每份4个数,再转成十六进制的。

$ echo 0 0 255 | awk 'function gn(s,n){return(substr(s,1,n))}function n2b(x, n,r){for(n=1;n<=8;++n){r=x%2 r;x=int(x/2)}return(r)}function b2n(x, n,r){for(n=1;n<=length(x);++n)r=2*r+substr(x,n,1);return(r)}{hex=sprintf("%04X",b2n(gn(n2b($1),5) gn(n2b($2),6) gn(n2b($3),5)));print hex}'
001F

   

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2016-06-03 12:24 |只看该作者
果然这边大神多,非常感谢~~

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
8 [报告]
发表于 2016-06-03 12:27 |只看该作者
别人搞不了的问题, 依然可以搞定, 这才是大神. 向各位大神致敬!!!

求职 : 技术支持/维
论坛徽章:
0
9 [报告]
发表于 2016-06-03 14:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00
10 [报告]
发表于 2016-06-03 14:24 |只看该作者
看完上面大神的脚本,突然觉得自己要改行了。各种奇技淫巧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP