Chinaunix

标题: 一个计算问题 [打印本页]

作者: chinawwt    时间: 2002-12-13 20:31
标题: 一个计算问题
例如有test.txt文件
1 aaa  1000
2  bbb  1000
3  aaa  1000
4  aaa  1000
5  ccc  1000
6  bbb  1000
要求产生新文件格式为
1 aaa  3000
2  bbb  2000
5  ccc  1000
请各位高手指点,谢谢!
作者: biansj    时间: 2002-12-13 22:19
标题: 一个计算问题
写的有些复杂,我也没什么好方法

#!/usr/bin/ksh
awk '{print $2 }' 1.txt | sort -u > ./1.txt.tmp

while read keyword
do
    keyno=0
    keyvalue=0
    grep $keyword 1.txt | while read no nouse value
    do
        if [ $keyno -ge $no -o $keyno -eq 0 ]
        then
            keyno=$no
        fi
        (( keyvalue=keyvalue + value ))
    done
    echo "$keyno $keyword $keyvalue"
done<1.txt.tmp > 2.txt

rm -f ./1.txt.tmp

作者: flyegg    时间: 2002-12-13 23:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: chinawwt    时间: 2002-12-14 09:45
标题: 一个计算问题
biansj,你的程序不是不行,bsh可以吗?
作者: chinawwt    时间: 2002-12-14 09:48
标题: 一个计算问题
biansj,
一面字我打错了,程序不能运行,bsh可以吗?
作者: nhrms    时间: 2002-12-14 09:58
标题: 一个计算问题
  去掉第一行:
       awk '{print $2 }' 1.txt | sort -u > ./1.txt.tmp

while read keyword
do
   keyno=0
   keyvalue=0
   grep $keyword 1.txt | while read no nouse value
   do
       if [ $keyno -ge $no -o $keyno -eq 0 ]
       then
           keyno=$no
       fi
       (( keyvalue=keyvalue + value ))
   done
   echo &quot;$keyno $keyword $keyvalue&quot;
done<1.txt.tmp > 2.txt

rm -f ./1.txt.tmp


作者: chinawwt    时间: 2002-12-14 10:50
标题: 一个计算问题
运行后提示:
+:not found
作者: biansj    时间: 2002-12-14 12:41
标题: 一个计算问题
#!/usr/bin/bsh
awk '{print $2 }' 1.txt | sort -u > ./1.txt.tmp

while read keyword
do
    keyno=0
    keyvalue=0
    grep $keyword 1.txt | while read no nouse value
    do
        if [ $keyno -ge $no -o $keyno -eq 0 ]
        then
            keyno=$no
        fi
        keyvalue=`expr $keyvalue + $value`
        #(( keyvalue=keyvalue + value ))
    done
    echo &quot;$keyno $keyword $keyvalue&quot;
done<1.txt.tmp > 2.txt

rm -f ./1.txt.tmp

作者: chinawwt    时间: 2002-12-14 15:04
标题: 一个计算问题
运行后,输出:
0 aaa 0
0 bbb 0
0 ccc 0
不对!
作者: biansj    时间: 2002-12-14 15:12
标题: 一个计算问题
你把我写的内容C&amp一个文件file,chmod +x file,然后运行./file
注意1.txt要在当前目录,结果为2.txt,如果不对,我就不清楚了
作者: chinawwt    时间: 2002-12-14 15:21
标题: 一个计算问题
我刚才就是这么做的,出来结果就这样
作者: 红豆    时间: 2002-12-16 01:17
标题: 一个计算问题

改成这样就可以了。
  1. awk '{print $2 }' test.txt | sort -u > ./1.txt.tmp
  2. while read keyword
  3. do
  4.   keyno=0
  5.   keyvalue=0
  6.   grep $keyword test.txt  > 2.txt.tmp
  7.   while read no nouse value
  8.   do
  9.     if [ $keyno -ge $no -o $keyno -eq 0 ]
  10.     then
  11.       keyno=$no
  12.     fi
  13.     keyvalue=`expr $keyvalue + $value`
  14.   done < 2.txt.tmp
  15.   echo "$keyno $keyword $keyvalue"
  16. done <1.txt.tmp
  17. rm -f ./[12].txt.tmp
复制代码

作者: laoxia    时间: 2002-12-16 07:41
标题: 一个计算问题
环境为PC SOLARIS 7。
上边的还是执行不了,俺看一下,原来在执行
awk '{print $2 }' test.txt | sort -u > ./1.txt.tmp 时,产生的文件 1.txt.tmp
的头两行为空格,导致脚本执行不好。俺把那行改一下,变为两行:
-------------------------------------------------
awk '{print $2 }' 1.txt | sort -u > ./1.txt.temp
grep -v &quot;^ *$&quot; 1.txt.temp > 1.txt.tmp
------------------------------------------------
执行正常:
------------------------------------------------
# ./sortnadd
0+1 aaa 3000
0+2 bbb 2000
0+5 ccc 1000
-----------------------------------------------
哪位高手指点一下,为何有空行?
作者: laoxia    时间: 2002-12-16 08:05
标题: 一个计算问题
0+1 aaa 3000

0+1 啥子意思?
作者: laoxia    时间: 2002-12-16 08:19
标题: 一个计算问题
楼上贴子作废啊,SORRY,我自己把自己骗了
作者: edwardcj    时间: 2002-12-16 08:40
标题: 一个计算问题
楼上各位有考虑过如果原始数据量很大(比如5万条、50万条?)时执行效率的问题吗?
如果处理每个关键字都要扫描一下源文件的话似乎太慢了?
#!/bin/sh
sort +1 -2 test.txt > 1.txt
awk 'BEGIN{no=-1&#59;}{if (no==-1){no=$1&#59;k=$2&#59;tot=0&#59;} \
                   if (k==$2) {tot+=$3&#59;} \
                   else{printf &quot;%d %s %d\n&quot;, no,k,tot&#59; \
                        no=$1&#59; k=$2&#59; tot=$3&#59;} } \
     END{printf &quot;%d %s %d\n&quot;, no,k,tot&#59;}' 1.txt > output.txt
rm -f 1.txt
作者: chinawwt    时间: 2002-12-16 09:22
标题: 一个计算问题
谢谢各位!
作者: laoxia    时间: 2002-12-16 09:32
标题: 一个计算问题
兄弟高见,

sort +1 -2 啥子意思?
作者: laoxia    时间: 2002-12-17 12:19
标题: 一个计算问题
弟兄们,俺是新手,请指教则个!
作者: laoxia    时间: 2002-12-18 04:42
标题: 一个计算问题
up
作者: 红袖添香    时间: 2002-12-18 05:33
标题: 一个计算问题

http://www.fanqiang.com/a1/b5/20010923/0805001336.html
作者: laoxia    时间: 2002-12-18 05:44
标题: 一个计算问题
感谢
作者: valentine    时间: 2002-12-18 10:14
标题: 一个计算问题
这个问题的本质还是分组求和问题,第一个自定相对来说无甚含义,因此我简单的给出下面的答案:
awk '{total[$2]+=$3}END{for (s in total){printf(&quot;%s %d\n&quot;,s,total)}' 1.txt
作者: nkliyong    时间: 2002-12-18 10:34
标题: 一个计算问题
斑竹,这是什么shell?ksh 好象不可以
作者: nile    时间: 2002-12-18 10:51
标题: 一个计算问题
下面引用由红豆2002/12/16 01:17am 发表的内容:
改成这样就可以了。
awk '{print $2 }' test.txt | sort -u > ./1.txt.tmp
while read keyword
do
...

为什么运行后 总是

0 aaa 0
0 bbb 0
0 ccc 0

:emn7:        
作者: valentine    时间: 2002-12-18 11:02
标题: 一个计算问题
下面引用由nkliyong2002/12/18 10:34am 发表的内容:
斑竹,这是什么shell?ksh 好象不可以
哪里不可以?
这是awk的问题,如果你引号用的对的化,有shell无关。
作者: aloneflasher    时间: 2003-07-30 23:19
标题: 一个计算问题
awk '{tot1[$1]+=$2}END{for (s in tot1) {printf "%s\t%d\n",s,tot1}' AA
作者: hudong    时间: 2003-07-31 15:48
标题: 一个计算问题
tt




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2