LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1943|回复: 7

awk 处理文本中的数据,要求如下

[复制链接]
发表于 2005-11-17 01:40:50 | 显示全部楼层 |阅读模式
a文件如下:
001  100
001  200
001 150
002  40
002   40
003    40
003    800
003    800
003   15
004    120
.......
我想把第一列相同的,第二列累加
001   450
002   80
003   1655
.........
 楼主| 发表于 2005-11-17 01:47:20 | 显示全部楼层
我的方法是把第一列的值取出放入一个文件b中
b内容如下:
001
002
003
004
......
我写了一个循环
for i in $(cat b)
do
      awk ' $1=="'$i'"  { mysum+=$2 } END { print “'$i'”,$mysum } '   a  > >c
done
但是b文件大了之后,效率太慢,有别的好方法吗?
回复 支持 反对

使用道具 举报

发表于 2005-11-17 09:04:30 | 显示全部楼层
awk不熟,只是不明白,为什么不用其他编程语言呢,shell处理这样的东西有什么优点?
回复 支持 反对

使用道具 举报

发表于 2005-11-17 11:27:55 | 显示全部楼层
用C,逐字节处理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-17 19:35:54 | 显示全部楼层

已经处理好了

我们的unix机器上没有c和其它语言的编译环境,而awk可以格式化输出.
想了一个笨办法,
awk ' { if ($1!=b1 )  b2=$2 ; printf("%4s%10.2f",b1,b2) ;else b2+=$2 ; }
         END { printf ("%4s%10.2f",b1,b2) } '  a  |sed '1d' >b
回复 支持 反对

使用道具 举报

发表于 2009-2-2 20:11:29 | 显示全部楼层
awk版本: awk '{ array[$1] += $2 } END { for (x in array) print x, array[x] }' a
perl版本:
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. my %array;
  5. while (<>) {
  6.         chomp;
  7.         my @parts = split();
  8.         $array{$parts[0]} += $parts[1];
  9. }
  10. foreach (keys %array) {
  11.         print "$_ $array{$_}\n";
  12. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-2-2 22:35:25 | 显示全部楼层
其实和楼上是一样的:

  1. #!/usr/bin/perl

  2. while (<>) {
  3.         next if ! (/\d/); #跳过包含非数字的行
  4.         ($key, $value) = split;
  5.         $array{$key} += $value;
  6. }

  7. foreach (sort keys %array) {
  8.         print "$_ $array{$_}\n";
  9. }

复制代码
回复 支持 反对

使用道具 举报

发表于 2009-2-11 15:20:29 | 显示全部楼层
cat a |awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a}'
如果需要排序的话可以在后边加上|sort

root:~$ cat xx|awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a}'|sort
001 450
002 80
003 1655
004 120


Post by ltz3022003;1324233
a文件如下:
001  100
001  200
001 150
002  40
002   40
003    40
003    800
003    800
003   15
004    120
.......
我想把第一列相同的,第二列累加
001   450
002   80
003   1655
.........
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表