免费注册 查看新帖 |

Chinaunix

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

awk补齐问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-01 17:38 |只看该作者 |倒序浏览
比如有这样内容
0,6 a
0,7 b
0,9 c
1,2 hhh
1,3 ccc
1,7 aaa

想补齐成
0,6 a
0,7 b
0,8 xxx
0,9 c
1,2 hhh
1,3 ccc
1,4 xxx
1,5 xxx
1,6 xxx
1,7 aaa

就是把没有的字段用xxx来填充

个人觉得一个使用数组的awk就可以搞定,但没想到好的办法

论坛徽章:
0
2 [报告]
发表于 2011-07-01 20:06 |只看该作者
本帖最后由 sk1418 于 2011-07-01 20:32 编辑

可能是笨法子:
前提是你先排好序

  1. echo "0,6 a
  2. 0,7 b
  3. 0,9 c
  4. 1,2 hhh
  5. 1,3 ccc
  6. 1,7 aaa"|awk -F',| ' '{if(!a && !b){a=$1;b=$2;print $0;next;}
  7. if(a==$1){
  8.     if($2!=(b+1))
  9.         for (i=1;i<$2-b;i++)
  10.             print $1 "," b+i " xxx";
  11.     b=$2
  12. }else{
  13.     a=$1;b=$2;
  14. }
  15. print $0;
  16. }'
  17. 结果:
  18. 0,6 a
  19. 0,7 b
  20. 0,8 xxx
  21. 0,9 c
  22. 1,2 hhh
  23. 1,3 ccc
  24. 1,4 xxx
  25. 1,5 xxx
  26. 1,6 xxx
  27. 1,7 aaa
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
3 [报告]
发表于 2011-07-01 20:35 |只看该作者
回复 1# joan8363

  1. #!/bin/bash

  2. awk -F",| " '
  3. {
  4.     if(!($1 in a) || NR==1){
  5.         min[$1]=$2
  6.         max[$1]=$2
  7.     }
  8.     a[$1]
  9.     min[$1]=min[$1]<$2?min[$1]:$2
  10.     max[$1]=max[$1]>$2?max[$1]:$2
  11.     b[$1","$2]=$3        
  12. }
  13. END{
  14.     for(i in a){
  15.                 for(j=min[i];j<=max[i];j++){
  16.                         var=i","j
  17.                         if(var in b){
  18.                                 print var, b[var]
  19.                         }
  20.                         else {
  21.                                 print var, "xxxx"
  22.                         }
  23.                 }
  24.         }
  25. }
  26. ' file
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-07-01 21:23 |只看该作者
回复 1# joan8363
  1. [root@station3 ~]# cat a.txt
  2. 0,6 a
  3. 0,7 b
  4. 0,9 c
  5. 1,2 hhh
  6. 1,3 ccc
  7. 1,7 aaa
  8. [root@station3 ~]#  awk '{gsub(",",".")}NR==1{a=$1*10+1;f1=int($1)}{b=$1*10;if(f1==int($1)){while(a<b){print a/10,"xxx";a++}}print $0;a=$1*10+1;f1=int($1)}' a.txt | tr -s '.' ','
  9. 0,6 a
  10. 0,7 b
  11. 0,8 xxx
  12. 0,9 c
  13. 1,2 hhh
  14. 1,3 ccc
  15. 1,4 xxx
  16. 1,5 xxx
  17. 1,6 xxx
  18. 1,7 aaa
  19. [root@station3 ~]#
复制代码

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
5 [报告]
发表于 2011-07-01 23:25 |只看该作者
awk 'BEGIN{FS=",| ";a=9}{if($2-a>1){for(i=$2-a-1;i>0;i--){print $1","$2-i" xxx"}}print;a=$2}' file

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

  1. $ echo '0,6 a
  2. 0,7 b
  3. 0,9 c
  4. 1,2 hhh
  5. 1,3 ccc
  6. 1,7 aaa' |awk 'NR==FNR{a[$1]=$2;next}{print $0, $0 in a?a[$0]:"none"}' - <(echo {0..1},{1..9} |tr ' ' '\n')
  7. 0,1 none
  8. 0,2 none
  9. 0,3 none
  10. 0,4 none
  11. 0,5 none
  12. 0,6 a
  13. 0,7 b
  14. 0,8 none
  15. 0,9 c
  16. 1,1 none
  17. 1,2 hhh
  18. 1,3 ccc
  19. 1,4 none
  20. 1,5 none
  21. 1,6 none
  22. 1,7 aaa
  23. 1,8 none
  24. 1,9 none
复制代码

论坛徽章:
0
7 [报告]
发表于 2011-07-02 02:07 |只看该作者
yinyuemi 发表于 2011-07-01 23:40



    这个巧妙。

论坛徽章:
0
8 [报告]
发表于 2011-07-02 03:08 |只看该作者
回复 6# yinyuemi


    够犀利!受教了

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2011-07-03 09:59 |只看该作者
原始想法....
$ awk -F'[, ]' 'NR==1{a=$1;b=$2;print $0;next}{if($1!=a){a=$1;b=$2;print;next}while($2!=++b){print a","b " xxx"}print}' FILE

合并NR==1与$1!=a(最后发现是相当于2楼改良版)
$ awk -F'[, ]' '{if(a==""||$1!=a){a=$1;b=$2;print;next}while($2!=++b){print a","b " xxx"}print}' FILE

论坛徽章:
0
10 [报告]
发表于 2011-07-04 09:30 |只看该作者
原始想法....
$ awk -F'[, ]' 'NR==1{a=$1;b=$2;print $0;next}{if($1!=a){a=$1;b=$2;print;next}while($2 ...
jason680 发表于 2011-07-03 09:59



    第2个方法最喜欢,牛
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP