免费注册 查看新帖 |

Chinaunix

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

awk 合并行请教~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-04 11:41 |只看该作者 |倒序浏览
源文件
  1. A           001             10
  2. A           002             20
  3. A           003             30
  4. B           004             40
  5. B           005             50
  6. C           006             60
  7. C           007             70
复制代码
需求实现以下格式
  1. A      AA     B     BB   C     CC
  2. 001    10     004   40   006   60
  3. 002    20     005   50   007   70
  4. 003    30
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-06-04 13:44 |只看该作者
回复 1# wvuu
  1. $ echo 'A           001             10
  2. A           002             20
  3. A           003             30
  4. B           004             40
  5. B           005             50
  6. C           006             60
  7. C           007             70' |\
  8. awk '{if($1==v){nr++;a[nr,nf]=$2;a[nr,++nf]=$3;nf--;t=1}else{nr=1;nf+=t;a[nr,++nf]=$1;a[nr,++nf]=$1 $1;nf--;nr++;a[nr,nf]=$2;a[nr,++nf]=$3;nf--};v=$1}END{nr++;nf++;for(i=1;i<=nr;i++){for(j=1;j<=nf;j++)printf a[i,j] "\t";print""}}'
  9. A       AA      B       BB      C       CC
  10. 001     10      004     40      006     60
  11. 002     20      005     50      007     70
  12. 003     30
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-06-04 15:54 |只看该作者
回复 2# yinyuemi
大牛。给力~~多谢

论坛徽章:
0
4 [报告]
发表于 2011-06-04 17:19 |只看该作者
  1. 001     10      004     40      006     60
  2. 002     20      005     50      007     70
  3. 003     30
复制代码
如果最后要得到这样的效果。该怎么裁剪一下呢。有点看不懂上面那个大牛的用法~~

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-06-04 22:21 |只看该作者
回复 4# wvuu
  1. awk '{if($1==v){nr++;a[nr,nf]=$2;a[nr,++nf]=$3;nf--;t=1}else{nr=1;nf+=t;a[nr,++nf]=$1;a[nr,++nf]=$1 $1;nf--;nr++;a[nr,nf]=$2;a[nr,++nf]=$3;nf--};v=$1}END{nr++;nf++;for(i=2;i<=nr;i++){for(j=1;j<=nf;j++)printf a[i,j] "\t";print""}}'
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-06-05 01:08 |只看该作者
回复 2# yinyuemi

如果含有B的行比C的行多不止一行,结果会显示不全
    可以改成这样不? awk '{if($1 == m){nr++;a[nr,nf]=$2;a[nr,++nf]=$3;nf--;t=1;nr_max=nr>nr_max?nr:nr_max}else{nr=1;nf+=t;a[nr,++nf]=$1;a[nr,++nf]=$1 $1;nr++;nf--;a[nr,nf]=$2;a[nr,++nf]=$3;nf--};m=$1}END{nf++;for(i=1;i<=nr_max;i++){for(j=1;j<=nf;j++){printf a[i,j] "\t"};print ""}}'

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-06-12 16:07 |只看该作者
回复  yinyuemi

如果含有B的行比C的行多不止一行,结果会显示不全
    可以改成这样不? awk '{if( ...
lionfun 发表于 2011-06-05 01:08



    的确是有bug,多谢改进。

论坛徽章:
0
8 [报告]
发表于 2011-06-13 08:39 |只看该作者

  1. awk '{a[$1]++;a[$1$1]++;b[$1 "_" a[$1]]=$2;b[$1$1 "_"a[$1]]=$3}END{asorti(a,c);k=0;for(i=1;i<=length(c);i++){printf "%s\t",c[i];k=(k<a[c[i]])?a[c[i]]:k;}print "";for(j=1;j<=k;j++){s="";for(i=1;i<=length(c);i++){printf("%s%s\t",s,b[c[i]"_"j])}print "";}}'
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-06-13 12:54 |只看该作者
本帖最后由 zzy7186 于 2011-06-13 12:56 编辑

源文件:

  1. A           001             10
  2. A           002             20
  3. A           003             30
  4. B           004             40
  5. B           005             50
  6. C           006             60
  7. C           007             70
  8. D           008             80
  9. E           009             90
  10. E           010             100
复制代码
awk.file

  1. #!/bin/gawk -f
  2. {
  3.         c[$1]++;
  4.         a[$1,c[$1]]=$2;
  5.         b[$1,$1,c[$1]]=$3;
  6.         ml=ml>c[$1]?ml:c[$1];
  7. }
  8. END{
  9.         n=asorti(c);
  10.         for(i=1;i<=n;i++)
  11.         {
  12.                 printf "%s\t",c[i];
  13.                 printf "%s%s\t",c[i],c[i];
  14.         }
  15.         printf "\n";
  16.         for(j=1;j<=ml;j++)
  17.         {
  18.                 for(i=1;i<=n;i++)
  19.                 {
  20.                         if(a[c[i],j]){
  21.                                 printf "%s\t",a[c[i],j];
  22.                         }else{
  23.                                 printf "\t";
  24.                         }
  25.                         if(b[c[i],c[i],j]){
  26.                                 printf "%s\t",b[c[i],c[i],j];
  27.                         }else{
  28.                                 printf "\t";
  29.                         }
  30.                 }

  31.                 printf "\n";
  32.         }
  33. }
复制代码

  1. ./awk.file urlfile
  2. A       AA      B       BB      C       CC      D       DD      E       EE
  3. 001     10      004     40      006     60      008     80      009     90
  4. 002     20      005     50      007     70                      010     100
  5. 003     30
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP