免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: expert1
打印 上一主题 下一主题

文件区间整理问题---悬赏100分 [复制链接]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
61 [报告]
发表于 2010-09-03 11:07 |只看该作者
回复 82# expert1

试试看吧:
  1. awk '
  2. BEGIN {
  3.         FS = "-"
  4. }
  5. /section/{
  6.         s = $1
  7. }
  8. NF == 2 {
  9.         if (NR == FNR)
  10.         {
  11.                 a[$0] = s
  12.                 next
  13.         }
  14.         else {
  15.                 for(i in a)
  16.                 {
  17.                         k = 0
  18.                         split(i ,A ,"-")
  19.                         if ($1 > A[1] && $1 <= A[2])
  20.                         {
  21.                                 a[A[1] "-" $1 - 1] = a[i]
  22.                                 k = 1
  23.                         }
  24.                         if ($2 >= A[1] && $2 < A[2])
  25.                         {
  26.                                 a[$2 + 1 "-" A[2]] = a[i]
  27.                                 k = 1
  28.                         }
  29.                         if($1 <= A[1] && $2 >= A[2])
  30.                         {
  31.                                 k = 1
  32.                         }
  33.                         if (k)
  34.                                 delete a[i]
  35.                 }
  36.                 a[$0] = s
  37.         }
  38. }
  39. END {
  40.         for(i in a)
  41.                 b[a[i]] = b[a[i]] "\n" i
  42.         for(i in b)
  43.                 print i "" b[i]
  44. }
  45. ' a.txt b.txt
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
62 [报告]
发表于 2010-09-03 11:13 |只看该作者
回复 83# ly5066113


    TIM哥真是强大,刚试过了,列举了最大区间长度90亿,居然瞬间完成了。佩服啊。
PS:能否给我们讲讲思路?

论坛徽章:
0
63 [报告]
发表于 2010-09-03 11:14 |只看该作者
回复 83# ly5066113


    太强大了,抢先膜拜
Orz

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
64 [报告]
发表于 2010-09-03 11:42 |只看该作者
回复 84# expert1


思路是这样的:
对与a中的每个区间,记录它所属的section
例如:
a[20-30]=section1
a[10-19]=section2
然后对于b的每个区间,遍历数组a,判断区间是否有交集
这里有3交集的情况:
1、b的左区间在a中,如a  20-30   b  25-35
2、b的右区间在a中,如a  20-30   b  15-25
3、b真包含a,如a  20-30   b  15-35
对于不同的情况做不同的处理,处理后将b的区间添加到数组a中

此方法的性能和区间的大小无关,但和a的记录数有关
对于b的每个区间,都要将a全部遍历一次

楼主根据实际情况,选择合适的方法吧

论坛徽章:
0
65 [报告]
发表于 2010-09-04 13:14 |只看该作者
好强悍的题 我要好好向大家学习!

论坛徽章:
0
66 [报告]
发表于 2010-09-06 10:44 |只看该作者
太难了,,分难赚呀

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
67 [报告]
发表于 2010-09-06 11:11 |只看该作者
回复 89# expert1


section为什么变成"nihao"了,代码里都是以section做关键字的。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
68 [报告]
发表于 2010-09-06 11:39 |只看该作者
回复 93# expert1


没发现啥问题。
  1. $ cat a.txt
  2. "nihao"
  3. 3.54895e+09-3.54897e+09
  4. 3.54913e+09-3.54917e+09
  5. 3.67084e+09-3.67085e+09
  6. 3.67085e+09-3.67087e+09
  7. "hi"
  8. 3.54908e+09-3.54908e+09
  9. "hello"
  10. 2067005440-2067267583
  11. 2070216704-2070282239
  12. 2073362432-2073427967
  13. 2074083328-2074345471
  14. 3.68386e+09-3.68386e+09
  15. 3.68407e+09-3.68407e+09
  16. 3.68407e+09-3.68411e+09
  17. 3.73011e+09-3.73015e+09
  18. 3.73031e+09-3.73044e+09
  19. "thankyou"
  20. 1038649056-1038649087
  21. 1038770448-1038770463
  22. 1038770464-1038770495
  23. 1038770496-1038770559
  24. 1038770560-1038770687
  25. 1038770704-1038770719
  26. 1038770720-1038770751
  27. 1038770752-1038770815
  28. 1038770816-1038770943
  29. 1038771200-1038771711
  30. 1038774272-1038774527
  31. 1038773760-1038774271
  32. 1038776336-1038776351
  33. 1038776352-1038776383
  34. 1038776384-1038776447
  35. 1038776448-1038776575
  36. 1038776608-1038776639
  37. 1038776640-1038776703
  38. 1038776704-1038776831
  39. 1038777360-1038777375
  40. 1038777376-1038777407
  41. 1038777408-1038777471
  42. 1038777472-1038777599
  43. 1038777728-1038777855
  44. 1038827520-1038827583
  45. 1038827712-1038827775
  46. 1038828032-1038828543
  47. 1038828560-1038828575
  48. $ cat b.txt
  49. sectionx
  50. 992346112-992362495
  51. 3725639680-3725643775
  52. 3719051264-3719053311
  53. 3664298240-3664300031
  54. 2102956032-2102957055
  55. 3395924480-3395926015
  56. 3395862048-3395862527
  57. 3395862016-3395862047
  58. 3544346624-3544350719
  59. 3546364160-3546364415
  60. 3658330112-3658350591
  61. 1995806720-1995807743
  62. 1885048832-1885052927
  63. 1958914048-1958916095
  64. 2108381696-2108383231
  65. 992295424-992295935
  66. 1947418624-1947435007
  67. 1032970240-1032978431
  68. 3411880448-3411880959
  69. 2018754560-2018762751
  70. 1999142912-1999175679
  71. 3072425984-3072458751
  72. 1995825152-1995827199
  73. 1950113792-1950115839
  74. 3708598272-3708598527
  75. 3524186368-3524187135
  76. 3727845376-3727847423
  77. 3689615360-3689619455
  78. 3670849024-3670849279
  79. 3659432704-3659432959
  80. 3719085056-3719086079
  81. 1885093888-1885100031
  82. 3524197376-3524197631
  83. 2102923776-2102924287
  84. 3664297984-3664298239
  85. 2108375040-2108381183
  86. 3682840576-3682861055
  87. 1999241216-1999249407
  88. 3546341376-3546343423
  89. 2047471616-2047473663
  90. 3074097408-3074097663
  91. 1038829312-1038829567
  92. 2081792000-2081796095
  93. 2081742848-2081746943
  94. $ awk '
  95. > BEGIN {
  96. >         FS = "-"
  97. > }
  98. > NF == 1{
  99. >         s = $1
  100. > }
  101. > NF == 2 {
  102. >         if (NR == FNR)
  103. >         {
  104. >                 a[$0] = s
  105. >                 next
  106. >         }
  107. >         else {
  108. >                 for(i in a)
  109. >                 {
  110. >                         k = 0
  111. >                         split(i ,A ,"-")
  112. >                         if ($1 > A[1] && $1 <= A[2])
  113. >                         {
  114. >                                 a[A[1] "-" $1 - 1] = a[i]
  115. >                                 k = 1
  116. >                         }
  117. >                         if ($2 >= A[1] && $2 < A[2])
  118. >                         {
  119. >                                 a[$2 + 1 "-" A[2]] = a[i]
  120. >                                 k = 1
  121. >                         }
  122. >                         if($1 <= A[1] && $2 >= A[2])
  123. >                         {
  124. >                                 k = 1
  125. >                         }
  126. >                         if (k)
  127. >                                 delete a[i]
  128. >                 }
  129. >                 a[$0] = s
  130. >         }
  131. > }
  132. > END {
  133. >         for(i in a)
  134. >                 b[a[i]] = b[a[i]] "\n" i
  135. >         for(i in b)
  136. >                 print i "" b[i]
  137. > }
  138. > ' a.txt b.txt
  139. "hello"
  140. 2067005440-2067267583
  141. 2073362432-2073427967
  142. 3.73031e+09-3.73044e+09
  143. 3.68386e+09-3.68386e+09
  144. 3.68407e+09-3.68407e+09
  145. 2074083328-2074345471
  146. 3.73011e+09-3.73015e+09
  147. 2070216704-2070282239
  148. 3.68407e+09-3.68411e+09
  149. "hi"
  150. 3.54908e+09-3.54908e+09
  151. sectionx
  152. 1947418624-1947435007
  153. 1885048832-1885052927
  154. 1999241216-1999249407
  155. 3664297984-3664298239
  156. 3658330112-3658350591
  157. 1032970240-1032978431
  158. 2108381696-2108383231
  159. 2081742848-2081746943
  160. 3689615360-3689619455
  161. 3074097408-3074097663
  162. 2108375040-2108381183
  163. 3546341376-3546343423
  164. 2081792000-2081796095
  165. 3659432704-3659432959
  166. 3524186368-3524187135
  167. 3682840576-3682861055
  168. 3719051264-3719053311
  169. 3719085056-3719086079
  170. 3524197376-3524197631
  171. 3725639680-3725643775
  172. 1885093888-1885100031
  173. 2047471616-2047473663
  174. 1995825152-1995827199
  175. 992295424-992295935
  176. 2102923776-2102924287
  177. 3395924480-3395926015
  178. 2102956032-2102957055
  179. 3727845376-3727847423
  180. 2018754560-2018762751
  181. 1038829312-1038829567
  182. 3395862016-3395862047
  183. 3546364160-3546364415
  184. 1958914048-1958916095
  185. 1995806720-1995807743
  186. 3544346624-3544350719
  187. 3708598272-3708598527
  188. 3670849024-3670849279
  189. 992346112-992362495
  190. 3411880448-3411880959
  191. 1950113792-1950115839
  192. 3072425984-3072458751
  193. 3395862048-3395862527
  194. 3664298240-3664300031
  195. 1999142912-1999175679
  196. "nihao"
  197. 3.67085e+09-3.67085e+09
  198. 3.54913e+09-3.54917e+09
  199. 3.54895e+09-3.54897e+09
  200. 3.67085e+09-3.67087e+09
  201. "thankyou"
  202. 1038773760-1038774271
  203. 1038770704-1038770719
  204. 1038776336-1038776351
  205. 1038776352-1038776383
  206. 1038770496-1038770559
  207. 1038649056-1038649087
  208. 1038774272-1038774527
  209. 1038777728-1038777855
  210. 1038777408-1038777471
  211. 1038776608-1038776639
  212. 1038776384-1038776447
  213. 1038770816-1038770943
  214. 1038777472-1038777599
  215. 1038776704-1038776831
  216. 1038828032-1038828543
  217. 1038770720-1038770751
  218. 1038827712-1038827775
  219. 1038777360-1038777375
  220. 1038770752-1038770815
  221. 1038777376-1038777407
  222. 1038828560-1038828575
  223. 1038770560-1038770687
  224. 1038827520-1038827583
  225. 1038770448-1038770463
  226. 1038776448-1038776575
  227. 1038776640-1038776703
  228. 1038770464-1038770495
  229. 1038771200-1038771711
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
69 [报告]
发表于 2010-09-06 11:43 |只看该作者
回复 93# expert1


哦,知道了,你改成[a-z]有问题,科学计数法中有字母e
我用NF==1就没问题。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
70 [报告]
发表于 2010-09-06 12:11 |只看该作者
回复 95# ly5066113


    呵呵,是啊,tim哥一语惊醒梦中人啊,我周日上午看了半天怎么也想不通,以为长度问题溢出了呢。没想到数据里有一个字母e,刚好/[a-z]/会匹配到产生这个奇怪的问题。哈哈。原来如此,谢了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP