免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本处理 - 数据折叠输出 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2020-04-02 23:01 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2020-04-02 23:06 编辑

大家好!
我有一个问题向大家请教。
有这样一个排序表,左边是国家名,固定长度10个字符(包括空格,逗号等),右边是在该国的人数,数字长度5个数字(取值区间1-99999)。
  1. GEORGIA   : 1
  2. JORDAN    : 1
  3. OMAN      : 1
  4. PARAGUAY  : 1
  5. TOGO      : 1
  6. YEMEN     : 1
  7. BELARUS   : 2
  8. CUBA      : 2
  9. MONGOLIA  : 2
  10. NIGER     : 2
  11. SYRIAN ARA: 2
  12. TURKMENIST: 2
  13. ANGOLA    : 3
  14. NEW CALEDO: 3
  15. SLOVENIA  : 3
  16. ARMENIA   : 4
  17. LAO PEOPLE: 4
  18. RWANDA    : 4
  19. VENEZUELA : 4
  20. ALBANIA   : 5
  21. BOLIVIA   : 5
  22. PANAMA    : 5
  23. BURKINA FA: 6
  24. DOMINICAN : 6
  25. MADAGASCAR: 6
  26. MALI      : 7
  27. BRUNEI DAR: 8
  28. ESTONIA   : 8
  29. MOZAMBIQUE: 8
  30. CONGO, THE: 9
  31. EL SALVADO: 9
  32. BOSNIA AND: 14
  33. CAMBODIA  : 15
  34. CAMEROON  : 15
  35. GHANA     : 16
  36. GUATEMALA : 17
  37. KUWAIT    : 17
  38. COSTA RICA: 18
  39. AZERBAIJAN: 19
  40. LATVIA    : 19
  41. PUERTO RIC: 21
  42. UZBEKISTAN: 21
  43. LIBYA     : 22
  44. URUGUAY   : 24
  45. KAZAKHSTAN: 29
  46. SRI LANKA : 34
  47. ZAMBIA    : 34
  48. UGANDA    : 41
  49. IRAN, ISLA: 46
  50. IVORY COAS: 48
  51. CROATIA   : 51
  52. IRAQ      : 55
  53. SERBIA    : 56
  54. HONG KONG : 62
  55. CZECH REPU: 65
  56. LEBANON   : 65
  57. SENEGAL   : 70
  58. LITHUANIA : 73
  59. NORWAY    : 77
  60. ALGERIA   : 80
  61. SWEDEN    : 86
  62. QATAR     : 100
  63. ECUADOR   : 101
  64. BANGLADESH: 108
  65. PERU      : 116
  66. BULGARIA  : 120
  67. TUNISIA   : 124
  68. MYANMAR   : 127
  69. UKRAINE   : 127
  70. DENMARK   : 138
  71. TANZANIA, : 146
  72. IRELAND   : 147
  73. VIET NAM  : 154
  74. NIGERIA   : 157
  75. CHILE     : 160
  76. SLOVAKIA  : 197
  77. NEW ZEALAN: 200
  78. ISRAEL    : 204
  79. SWITZERLAN: 228
  80. KENYA     : 246
  81. AUSTRIA   : 263
  82. PAKISTAN  : 264
  83. MOROCCO   : 283
  84. KOREA, REP: 298
  85. ARGENTINA : 342
  86. SAUDI ARAB: 348
  87. SOUTH AFRI: 352
  88. NETHERLAND: 379
  89. TAIWAN, PR: 463
  90. THAILAND  : 466
  91. MALAYSIA  : 469
  92. COLOMBIA  : 501
  93. UNITED ARA: 582
  94. INDONESIA : 622
  95. EGYPT     : 630
  96. SINGAPORE : 648
  97. JAPAN     : 745
  98. AUSTRALIA : 857
  99. TURKEY    : 895
  100. SPAIN     : 965
  101. PHILIPPINE: 987
  102. GREECE    : 1025
  103. MEXICO    : 1163
  104. UK        : 1185
  105. ITALY     : 1478
  106. BELGIUM   : 1521
  107. BRAZIL    : 1588
  108. PORTUGAL  : 1753
  109. ROMANIA   : 1993
  110. CANADA    : 2491
  111. HUNGARY   : 2509
  112. RUSSIA    : 3222
  113. GERMANY   : 3581
  114. FRANCE    : 4815
  115. POLAND    : 6604
  116. FINLAND   : 6673
  117. USA       : 9514
  118. CHINA     : 14783
  119. INDIA     : 16385
复制代码


一共有119个国家。
现在希望按照给定的行数,将以上排序表的内容按以下格式输出:
例如,当给定行数line=15时,按照人数的多少,按第一列从上到下打印排名1-15的15个国家,其中国家名左对齐,人数右对齐;
然后第二列从上到下打印排名16-30的15个国家,第三列从上到下打印排名31-45的15个国家,依次类推,直到打印完最后一个国家,然后用空白补齐整个表格。
以下是一个示意图,中间的空白部分要用实际的数据来填满,最后的右下角的空白部分是补齐的空白。
  1. +----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+
  2. |INDIA     |16385|          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  3. |CHINA     |14783|          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  4. |USA       | 9514|          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  5. |FINLAND   | 6673|          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  6. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  7. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  8. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  9. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  10. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  11. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  12. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  13. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  14. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |JORDAN    |    1|
  15. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |GEORGIA   |    1|
  16. |          |     |          |     |          |     |          |     |          |     |          |     |          |     |          |     |
  17. +----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+----------+-----+
复制代码




谢谢大家的帮助!

论坛徽章:
0
2 [报告]
发表于 2020-04-03 11:38 |只看该作者
cat test.awk
  1. BEGIN{FS=": ";line=15}
  2. {n[NR]=$1;p[NR]=$2}
  3. END {
  4. s="+"
  5. col=int(NR/line)+1
  6. for(i=0;i<col;i++) s=s "----------+-----+"
  7. print s
  8. for(j=0;j<line;j++) {
  9.   printf "|"
  10.   for (i=NR;i>0;i-=line) {
  11.    printf("%-10s|",(i-j) in n?n[i-j]:"")
  12.    printf("%5s|",(i-j) in n?p[i-j]:"")
  13.   }
  14.   print ""
  15. }
  16. print s
  17. }
复制代码


awk -f test.awk file


论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
3 [报告]
发表于 2020-04-03 13:39 |只看该作者
非常感谢!

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2020-04-06 19:55 |只看该作者
回复 1# bikkuri


  1. awk -va=15 -F":" '{b[sprintf("%-10s|%5d",$1,$2)]=NR}END{c=length(b);if(c%a==0){d=c/a}else{d=int(c/a)+1;e=sprintf("%10s|%5s","","")};for(f=1;f<=d+1;f++){g=g?g"----------+-----+":"+"};print g;PROCINFO["sorted_in"]="@val_num_desc";for(h in b){j=i++%a;k[j]=k[j]?k[j]"|"h:h};for(l=0;l<=a-1;l++){printf("|%s|\n",c%a==0||l<c%a?k[l]:k[l]"|"e)};print g}' file
复制代码

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
5 [报告]
发表于 2020-05-23 11:34 |只看该作者


#.: echo -e "1a : 01\n2b : 02\n3c : 03" | awk 'BEGIN{FS=": ";line=15}{n[NR]=$1;p[NR]=$2} END { s="+" ;col=int(NR/li
ne)+1 ;for(i=0;i<col;i++) s=s "----------+-----+" ;print s ;for(j=0;j<line;j++) { printf "|"  ;for (i=NR;i>0;i-=line) { printf("%-10s|",(i-j) in n?n[i-j]:"")
;printf("%5s|",(i-j) in n?p[i-j]:"")  }  print "" } print s }'
+----------+-----+
|3c        |   03|
|2b        |   02|
|1a        |   01|
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
|          |     |
+----------+-----+

顺序和降序是哪个i-=line改不了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP