免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk文本处理,算是列转行,但是有些条件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-07 01:54 |只看该作者 |倒序浏览
本帖最后由 messud4312 于 2013-11-07 01:55 编辑

a1        b1        c1        1        0.0
a1        b1        c2        2        826.0
a1        b1        c3        3        170.0
a1        b1        c4        4        375.0
a2        b1        c1        5        0.0
a2        b1        c3        6        5.0
a2        b1        c4        7        826.0
a2        b1        c5        8        170.0
a3        b1        c1        9        0.0
a3        b1        c2        10        375.0
a3        b1        c3        11        826.0
a3        b1        c4        12        170.0
a3        b1        c5        13        0.0
有上面数据 第一列+第二列 作为一个id,以第三列为判断依据,重组数据。第三列共5个值,(c1,c2,c3,c4,c5)
根据第三列的值把4,5列的值列转行
转换后的格式如下(便于说明,以|隔开)
a1  b1 |  c1  c2  c3  c4  c5 | c2  c3  c4
第一部分 为 1,2列组合id
第二部分 为 c1至c5的顺序排列的第四列的值,若无则置0
第三部分 为 c2至c4的顺序排列的第五列的值,若无则置0

希望结果如下:
a1  b1  1  2    3    4    0    826.0  170.0  375.0
a2  b1  5  0    6    7    8    0         5.0     826.0
a3  b1  9  10  11  12  13   375.0  826.0  170.0

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2013-11-07 08:35 |只看该作者
本帖最后由 rdcwayx 于 2013-11-07 09:43 编辑
  1. awk 'BEGIN{l=split("c1 c2 c3 c4 c5",a," " )}
  2. {str=$1 FS $2 FS $3;b[str]=$4;c[str]=$5;d[$1 FS $2]}
  3. END{ for (i in d)
  4.          { printf i FS
  5.            for (j=1;j<=l;j++) printf (b[i FS a[j]]=="")?"0" FS : b[i FS a[j]] FS
  6.            for (j=2;j<=4;j++) printf (c[i FS a[j]]=="")?"0" FS : c[i FS a[j]] FS
  7.            printf RS               
  8.          }
  9.     }' infile |sort -n

  10. a1 b1 1 2 3 4 0 826.0 170.0 375.0
  11. a2 b1 5 0 6 7 8 0 5.0 826.0
  12. a3 b1 9 10 11 12 13 375.0 826.0 170.0
复制代码

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
3 [报告]
发表于 2013-11-07 09:20 |只看该作者
本帖最后由 klainogn 于 2013-11-07 09:22 编辑
  1. awk '{t1=$1FS$2;t2=t1""FS$3;a[t1];b[t2]=$4;c[t2]=$5}END{for(i in a){printf i" ";for(j=1;j<6;j++){printf("%-2d ",b[i""FS"c"j])}for(k=2;k<5;k++)printf("%-6.1f ",c[i""FS"c"k]+0);print ""}}' urfile | sort

  2. a1 b1 1  2  3  4  0  826.0  170.0  375.0
  3. a2 b1 5  0  6  7  8  0.0    5.0    826.0
  4. a3 b1 9  10 11 12 13 375.0  826.0  170.0
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2013-11-07 09:31 |只看该作者
  1. [root@localhost ~]# cat i
  2. a1        b1        c1        1        0.0
  3. a1        b1        c2        2        826.0
  4. a1        b1        c3        3        170.0
  5. a1        b1        c4        4        375.0
  6. a2        b1        c1        5        0.0
  7. a2        b1        c3        6        5.0
  8. a2        b1        c4        7        826.0
  9. a2        b1        c5        8        170.0
  10. a3        b1        c1        9        0.0
  11. a3        b1        c2        10        375.0
  12. a3        b1        c3        11        826.0
  13. a3        b1        c4        12        170.0
  14. a3        b1        c5        13        0.0
  15. [root@localhost ~]# awk '{t=$1"\t"$2;sub(/c/,"",$3);a[t,$3]=$4;b[t,$3]=$5;c[t]}END{for(i in c){printf i;for(j=1;j<=5;j++){if(a[i,j]=="")a[i,j]=0;printf "\t"a[i,j]}for(j=2;j<=4;j++){if(b[i,j]=="")b[i,j]=0;printf "\t"b[i,j]}print ""}}' i | sort
  16. a1      b1      1       2       3       4       0       826.0   170.0   375.0
  17. a2      b1      5       0       6       7       8       0       5.0     826.0
  18. a3      b1      9       10      11      12      13      375.0   826.0   170.0
  19. [root@localhost ~]#
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2013-11-07 09:32 |只看该作者
回复 2# rdcwayx
本帖最后由 rdcwayx 于 2013-11-07 10:49 编辑
版主是来自未来的~

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2013-11-07 09:36 |只看该作者
回复 3# klainogn
+0不错,省了一个if语句,学习了~

   

论坛徽章:
0
7 [报告]
发表于 2013-11-07 09:44 |只看该作者
都不错,基本思路是一致,在这统一谢个

论坛徽章:
105
狮子座
日期:2013-08-15 09:47:21处女座
日期:2013-10-09 10:04:27射手座
日期:2014-07-18 17:24:58处女座
日期:2014-07-24 09:29:49天秤座
日期:2014-07-24 09:30:06白羊座
日期:2014-07-24 15:26:28双子座
日期:2014-11-12 10:13:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之澳大利亚
日期:2015-05-11 09:56:392015年亚洲杯之巴勒斯坦
日期:2015-05-11 09:59:282015年亚洲杯之韩国
日期:2015-05-11 10:16:082015亚冠之水原三星
日期:2015-05-13 09:50:46
8 [报告]
发表于 2013-11-07 10:24 |只看该作者
本帖最后由 gaoke 于 2018-88-88 88:88 编辑

测试编辑时间显示

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
9 [报告]
发表于 2013-11-07 10:41 |只看该作者
本帖最后由 li0924 于 2013-11-07 16:20 编辑
  1. awk '{split($3,a,"");n=a[2];if(t<=n){b[n]=$4;c[n]=$5}else{printf s FS;{for(i=1;i<=5;i++)printf (i in b)?b[i] FS:0 FS;for(j=2;j<=4;j++)printf (j in c)?c[j] FS:0 FS;print "";delete b;delete c;b[n]=$4;c[n]=$5}}t=a[2];s=$1FS$2}'
复制代码
  1. a1  b1  1  2   3   4   0   826.0  170.0  375.0
  2. a2  b1  5  0   6   7   8   0      5.0    826.0
  3. a3  b1  9  10  11  12  13  375.0  826.0  170.0
复制代码

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
10 [报告]
发表于 2013-11-07 10:49 |只看该作者
  1. [redhat@localhost 1107]$ cat col.awk
  2. #! /bin/awk -


  3. {
  4.         t = a[$1FS$2]?a[$1FS$2]:$1FS$2
  5.         b[$3]
  6.         c[t FS $3] = $4
  7.         d[t FS $3] = $5
  8. }
  9. END{
  10.         l=asorti(a)
  11.         asorti(b)
  12.         for (i=1; i<=l; ++i){
  13.                 printf a[i]
  14.                 for (j=1; j<=5; ++j){
  15.                         printf FS
  16.                         printf c[a[i] FS b[j]]?c[a[i] FS b[j]]:0
  17.                 }
  18.                 for (k=2; k<=4; ++k){
  19.                         printf FS
  20.                         printf d[a[i] FS b[k]]?d[a[i] FS b[k]]:0
  21.                 }
  22.                 print ""
  23.         }
  24. }
  25. [redhat@localhost 1107]$ awk -f col.awk col5 | column -t
  26. a1  b1  1  2   3   4   0   826.0  170.0  375.0
  27. a2  b1  5  0   6   7   8   0      5.0    826.0
  28. a3  b1  9  10  11  12  13  375.0  826.0  170.0
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP