+ -
当前位置:首页 → 问答吧 → 文件处理

文件处理

时间:2011-07-01

来源:互联网

本帖最后由 linux68 于 2011-07-01 11:47 编辑

有一个如下格式的文件:
列号: 1                   2            3                        4                           5                  6                7               8
2011-06-30        key        q4:1$q3:4        f1:10$f6:21$int:19        a1:12$a4:8        c5:10        k9:21$k26:9          10
2011-06-30        key        q4:6$q3:6        f1:15$f6:11        a1:22$a4:18 c5:12 k9:11$k26:19                  
2011-06-30        key        q4:3          f1:5          a1:6$a4:6    c5:28        k9:19$k26:11   
像3-7这样的列很多,比如说有15列,文件每列之间用tab分隔,我想把文件处理成如下的结果,3-7这样的列里面冒号前面相同的值要相加,如果是像8列这样的列在结果中就不打印了,
请问怎么用awk实现呢?谢谢!
                                  列号
2011-06-30        key        3        q4        10
2011-06-30        key        3        q3        10
2011-06-30        key        4        f1        30
2011-06-30        key        4        f6        32
2011-06-30        key        4        int        19
2011-06-30        key        5        a1        40
2011-06-30        key        5        a4        32
2011-06-30        key        6        c5        50
2011-06-30        key        7        k9        51
2011-06-30        key        7        k26        39

作者: linux68   发布时间: 2011-07-01



QUOTE:
有一个如下格式的文件:
列号: 1                   2            3                        4           ...
linux68 发表于 2011-07-01 11:05




$ awk '{for(m=3;m<=NF;m++){split($m,d,/[:\$]/);n=1;while(d[n]){k[$1"\t"$2"\t"m"\t"d[n]]+=d[n+1];n+=2}}}END{n=asorti(k,N);for(t=1;t<=n;t++){print N[t]"\t"k[N[t]]}}' FILE

作者: jason680   发布时间: 2011-07-01

那位朋友给看看,谢谢了,着急 :emn33:

作者: linux68   发布时间: 2011-07-01

本帖最后由 yinyuemi 于 2011-07-01 12:41 编辑

回复 linux68
  1. $ echo '2011-06-30        key        q4:1$q3:4        f1:10$f6:21$int:19        a1:12$a4:8        c5:10        k9:21$k26:9
  2. 2011-06-30        key        q4:6$q3:6        f1:15$f6:11        a1:22$a4:18 c5:12 k9:11$k26:19
  3. 2011-06-30        key        q4:3          f1:5          a1:6$a4:6    c5:28        k9:19$k26:11' |\
  4. awk '{for(i=3;i<=NF;i++){len=split($i,a,/[:$]/);{for(j=1;j<=len;j++) {n=a[j];j++;b[$1"\t"$2"\t"i"\t"n]+=a[j]}}}}END{for(m in b)print m"\t"b[m]}' |\
  5. sort -k3,3n
  6. 2011-06-30      key     3       q3      10
  7. 2011-06-30      key     3       q4      10
  8. 2011-06-30      key     4       f1      30
  9. 2011-06-30      key     4       f6      32
  10. 2011-06-30      key     4       int     19
  11. 2011-06-30      key     5       a1      40
  12. 2011-06-30      key     5       a4      32
  13. 2011-06-30      key     6       c5      50
  14. 2011-06-30      key     7       k26     39
  15. 2011-06-30      key     7       k9      51
复制代码

作者: yinyuemi   发布时间: 2011-07-01

谢谢楼上的兄弟!

作者: linux68   发布时间: 2011-07-01

热门下载

更多