免费注册 查看新帖 |

Chinaunix

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

[数值计算] 用while read awk 计算的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-19 10:23 |只看该作者 |倒序浏览
数据f3.txt:
3 21 32 37 2 59
6 29 35 37 1 57

直接代入值执行awk '{print $4*1+$5*10}' f3.txt得到的结果是:
57
47

写的代码如下:
1 #!/bin/sh
  2 k=(0 10 100)
  3 w1=3
  4 w2=2
  5 while read line;
  6 do
  7 #echo $line;
  8 for((i=1;i<=$w2;i++))
  9 do
10 ((var1=$[$w1+$i]))
11 ((var2=$[${k[$i]}]))
12 echo $var1,$var2
13 awk -v var1=$var1 -v var2=$var2 '{total+=$var1*var2}END{print total}'
14 done
15 #echo $[var+=$var]
16 done <f3.txt


结果:
3,1
0
4,256

[admin@CentOS help]$

var1和var2为了确定列的位置,然后再相加,但确定第二个位置时却为空值,为何?然后后面就没法再继续了,请教各位大大解决之道。
awk本来已经是一行一行读入,但好像又不得不用while read 一行一行来读入计算,真是头大。
觉得很简单的一个计算,但好像shell好难,perl实现觉得容易一些。
以下是perl实现:
  1 #!/usr/bin/perl
  2 @k=(1,10,100);
  3 $w1=3;
  4 $w2=2;
  5 open(FD_LOG,"f3.txt");
  6 while(<FD_LOG>)
  7 {
  8     @arr=split(/ /,$_);
  9     $zhi=0;
10     for($i=0;$i<$w2;$i++)
11     {
12      $zhi=$arr[$w1+$i]*$k[$i]+$zhi;
13     }   
14     print $zhi."\n";
15  }  

请教请教大大们。。。。。。。。



论坛徽章:
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
2 [报告]
发表于 2013-10-19 11:14 |只看该作者
((var1=$[$w1+$i]))
((var2=$[${k[$i]}]))

这个没看懂

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
3 [报告]
发表于 2013-10-19 11:24 |只看该作者
回复 1# fangww_uestc


    数据f3.txt:
3 21 32 37 2 59
6 29 35 37 1 57


楼主想要什么结果,请直说

论坛徽章:
0
4 [报告]
发表于 2013-10-19 11:26 |只看该作者
回复 2# liion631818

生手就这样,本来前面加了啥东东来的,后来去掉了,这样就行
var1=$[$w1+$i]
var2=$[${k[$i]}]

所以觉得好麻烦,就两个值相加或者赋值,搞得好麻烦,或者是偶搞的麻烦。


   

论坛徽章:
0
5 [报告]
发表于 2013-10-19 11:28 |只看该作者
回复 3# 关阴月飞

想要这个结果awk '{print $4*1+$5*10}' f3.txt:

57
47


   

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
6 [报告]
发表于 2013-10-19 11:29 |只看该作者
回复 5# fangww_uestc


    意思就是用shell 方法来实现这个是么?

论坛徽章:
0
7
发表于 2013-10-19 11:30
回复 5# fangww_uestc

这个直接用值代入计算的结果
程序中是用变量才行


   

论坛徽章:
0
8 [报告]
发表于 2013-10-19 11:31 |只看该作者
回复 6# 关阴月飞
是的


   

论坛徽章:
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
9 [报告]
发表于 2013-10-19 12:05 |只看该作者
你的太复杂,不想看

  1. [lee@localhost ~]$ echo '3 21 32 37 2 59
  2. 6 29 35 37 1 57' | while read line; do set -- $line; echo $(( $4*1+$5*10 )); done
  3. 57
  4. 47

复制代码

论坛徽章:
0
10 [报告]
发表于 2013-10-19 12:39 |只看该作者
回复 9# liion631818
我哭,不要抛弃我,你就看两眼嘛,看在两个鸡蛋煮了一个小时都黄了的份上......

就是shell中变量传递,数值计算,还有啥啥的一大堆问题,perl实现不麻烦呀,比较清晰明了,但shell不知咋整。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP