免费注册 查看新帖 |

Chinaunix

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

[文本处理] 将新单词随机插入短句间的其中一个空格位置? [复制链接]

论坛徽章:
1
白羊座
日期:2014-11-13 10:19:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-28 13:12 |只看该作者 |倒序浏览
本帖最后由 iocg 于 2014-05-28 13:21 编辑

一个文本每行含有1~5个单词,每个单词以空格隔开
  1. uu  aaa  io  pp  tr
  2. emay  sad   food   hh
  3. ss   vv    bbb   ff    dd
  4. good  aaa   dd
  5. ......
复制代码
我想查找不含有aaa、bbb的行,将ccc、ddd、eee的其中一个单词(随机或循环),随机插入到该行的其中一个空格或行首行尾的位置?
例如第二行不含aaa或者bbb:
  1.   emay  sad   food  hh      
  2. ▲     ▲     ▲      ▲   ▲

  3. (随机在▲位置插入ccc  ddd  或eee其一)

复制代码
有办法做到吗(没替换的文本保持不变)?  如果我限定只对行长度20以下进行处理呢?

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-05-28 13:25 |只看该作者
回复 1# iocg
写个最简单的吧,循环加行首。
  1. awk 'BEGIN{words[0]="ccc";words[1]="dddd";words[2]="eee"} !/\<aaa\>|\<bbb\>/{$0=words[i++%3]" "$0}1' i
  2. uu  aaa  io  pp  tr
  3. ccc emay  sad   food   hh
  4. ss   vv    bbb   ff    dd
  5. good  aaa   dd
  6. uu  aaa  io  pp  tr
  7. dddd emay  sad   food   hh
  8. ss   vv    bbb   ff    dd
  9. good  aaa   dd
  10. uu  aaa  io  pp  tr
  11. eee emay  sad   food   hh
  12. ss   vv    bbb   ff    dd
  13. good  aaa   dd
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2014-05-28 13:27 |只看该作者
回复 1# iocg
限定行长20
  1. awk 'BEGIN{words[0]="ccc";words[1]="dddd";words[2]="eee"} !/\<aaa\>|\<bbb\>/&&length($0)<20{$0=words[i++%3]" "$0}1' i
复制代码

论坛徽章:
1
白羊座
日期:2014-11-13 10:19:16
4 [报告]
发表于 2014-05-28 13:48 |只看该作者
回复 2# Herowinter


    不过我只想得到
  1. uu  aaa  io  pp  tr
  2. ccc emay  sad   food   hh
  3. ss   vv    bbb   ff    dd
  4. good  aaa   dd
复制代码
  1. uu  aaa  io  pp  tr
  2. dddd emay  sad   food   hh
  3. ss   vv    bbb   ff    dd
  4. good  aaa   dd
复制代码
  1. uu  aaa  io  pp  tr
  2. eee emay  sad   food   hh
  3. ss   vv    bbb   ff    dd
  4. good  aaa   dd
复制代码
其中一个。
例如只插入行首,就随机插入ccc  ddd  eee其中一个就好。

但是不一定只是插入行首,如果多个单词插入困难的话,就用ccc就好,我想随机插入到句中一个空格或者行首行尾。执行一次就好

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-05-28 13:54 |只看该作者
回复 4# iocg
我的结果是对的呀,为了测试,我把源文件扩展了下,
把数据复制了3遍,只插入一遍呀。
   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-05-28 13:58 |只看该作者
回复 1# iocg
随机位置随机插入。
  1. awk 'BEGIN{words[0]="ccc";words[1]="dddd";words[2]="eee";srand()} !/\<aaa\>|\<bbb\>/&&length($0)<20{k1=int(rand()*100%(NF+1));k2=int(rand()*100%3);if(k1==NF){$0=$0" "words[k2]}else{$(k1+1)=words[k2]" "$(k1+1)}}1' i
  2. uu  aaa  io  pp  tr
  3. emay sad ccc food
  4. ss   vv    bbb   ff    dd
  5. good  aaa   dd
  6. uu  aaa  io  pp  tr
  7. ccc emay sad food
  8. ss   vv    bbb   ff    dd
  9. good  aaa   dd
  10. uu  aaa  io  pp  tr
  11. emay ccc sad food
  12. ss   vv    bbb   ff    dd
  13. good  aaa   dd
  14. uu  aaa  io  pp  tr
  15. dddd emay sad food
  16. ss   vv    bbb   ff    dd
  17. good  aaa   dd
  18. uu  aaa  io  pp  tr
  19. emay dddd sad food
  20. ss   vv    bbb   ff    dd
  21. good  aaa   dd
  22. uu  aaa  io  pp  tr
  23. emay  sad   food eee
  24. ss   vv    bbb   ff    dd
  25. good  aaa   dd

  26. cat i
  27. uu  aaa  io  pp  tr
  28. emay  sad   food  
  29. ss   vv    bbb   ff    dd
  30. good  aaa   dd
  31. uu  aaa  io  pp  tr
  32. emay  sad   food
  33. ss   vv    bbb   ff    dd
  34. good  aaa   dd
  35. uu  aaa  io  pp  tr
  36. emay  sad   food
  37. ss   vv    bbb   ff    dd
  38. good  aaa   dd
  39. uu  aaa  io  pp  tr
  40. emay  sad   food  
  41. ss   vv    bbb   ff    dd
  42. good  aaa   dd
  43. uu  aaa  io  pp  tr
  44. emay  sad   food
  45. ss   vv    bbb   ff    dd
  46. good  aaa   dd
  47. uu  aaa  io  pp  tr
  48. emay  sad   food
  49. ss   vv    bbb   ff    dd
  50. good  aaa   dd
复制代码

论坛徽章:
1
白羊座
日期:2014-11-13 10:19:16
7 [报告]
发表于 2014-05-28 20:45 来自手机 |只看该作者
谢谢!请问下gawk可以直接代替awk吗?代码要作何修改?

论坛徽章:
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
8 [报告]
发表于 2014-05-28 21:01 |只看该作者
回复 7# iocg
我们写的代码一般就是gawk~{:2_172:}

   

论坛徽章:
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
9 [报告]
发表于 2014-05-28 21:27 |只看该作者
本帖最后由 yestreenstars 于 2014-05-29 17:24 编辑
  1. awk 'BEGIN{srand()}length<20&&!/\<(aaa|bbb)\>/{r1=rand();s=r1<1/3?"ccc":r1<2/3?"ddd":"eee";r2=int(rand()*NF)+1;r3=int(rand()+0.5);if(r3)$r2=$r2" "s;else $r2=s" "$r2}1'
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
10 [报告]
发表于 2014-05-28 22:43 |只看该作者
awk 'BEGIN{srand()}length<20&&!/\<(aaa|bbb)\>/{r1=rand();s=r1<1/3?"ccc":r1<2/3?"ddd":"eee";r2=int(rand()*NF)+1;r3=int(rand()*2)+1;if(r3)$r2=$r2" "s;else $r2=s" "$r2}1'

int(rand()+0.5)?
@yestreenstars
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP