免费注册 查看新帖 |

Chinaunix

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

[文本处理] 数据展开 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-08 19:15 |只看该作者 |倒序浏览
各位大大好:

1: 一个文本, 每行是由字符 A, B, C, D 字符组成的。如:

A[BC]D[ABC]DA[BC]D
[BCA][ADB]DAA[BC]

2: [AB], [ABCD]..是一组. 在每一组之内, 字符没有重复, 如:

[AAB]   # A 重复
[ABC]   # 没有重复

3: 数据依序扩展

一行比如:  A[BC]D

数据依序扩展为:

ABD
ACD

一行比如: A[BC]D[AC]
数据依序扩展为:

ABDA
ABDC
ACDA
ACDC

4: 行1 输出 file.1, 行2 输出 file.2....

5: 每文本按照 limit 值 输出, (输出行数 <= limit):

一行比如: A[BC]D[AC]

比如: limit = 3, 输出行数 = 3

ABDA
ABDC
ACDA

一行比如: A[BC]
比如: limit = 5, 输出:

AB
AC

测试文件如下:( 假设 limit = 10 )

A[BC]D[ABC]DA[BC]D
[BCA][ADB]DAA[BC]
A[BC]D[AC]


结果:

file.1:
ABDADABD
ABDADACD
ABDBDABD
ABDBDACD
ABDCDABD
ABDCDACD
ACDADABD
ACDADACD
ACDBDABD
ACDBDACD

file.2:
BADAAB
BADAAC
BDDAAB
BDDAAC
BBDAAB
BBDAAC
CADAAB
CADAAC
CDDAAB
CDDAAC

file.3:
ABDA
ABDC
ACDA
ACDC



# 实际的一行数据可能看起来像这样
A[BC]D[AC]DAABACDA[AC]DDACA[BC]D[AC]DAAA[BC]DDDACB[AC]DAABCCD[AC]DCCA[BC]D[AC]DCA[BC]DACDA[BC]D[ABC]DA[BC]D[AC]DABCD[ACB]DA[BC]DACCDABCD[DC]DA[BCA]DDABCCBB

各位大大能不能给我这个数据扩展的脚本 ?

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
2 [报告]
发表于 2014-02-08 20:04 |只看该作者
本帖最后由 关阴月飞 于 2014-02-08 20:05 编辑

回复 1# gr33n


大概思路:
把 [ABC] 替换成 {A,B,C} 之后用echo就能打出所有组合
  1. awk -vl=10 -F '' '{for(i=0;i++<NF;){if($i=="["){s=1;continue}if($i=="]"){s=0}if(s)$i=$i","};gsub(/\[/,"{");gsub(/,]/,"}");"echo "$0 |getline a;split(a,b," ");for(n=0;n++<l;)print b[n] >"file."NR}' OFS=''  urfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-02-08 22:38 |只看该作者
回复 2# 关阴月飞


(⊙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 [报告]
发表于 2014-02-09 13:56 |只看该作者
  1. 脚本:
  2. #!/bin/awk -f
  3. BEGIN{FS="[][]";limit=10}
  4. {
  5.         for(i=0;i++<NF;){
  6.                 if(i%2)t=$i
  7.                 else{
  8.                         if(i>2){
  9.                                 for(j=0;j++<length(b[i-2]);){
  10.                                         for(k=0;k++<split($i,a,"");){
  11.                                                 b[i][++n]=b[i-2][j]""t""a[k]
  12.                                                 if(i==NF-1)b[i][n]=b[i][n]$(i+1)
  13.                                         }
  14.                                         if(n>=limit)break
  15.                                 }
  16.                                 n=0
  17.                         }else for(j=0;j++<split($i,a,"");)b[2][j]=t""a[j]
  18.                 }
  19.         }
  20.         for(i=1;i<=limit&&i<=length(b[NF-1]);i++)print b[NF-1][i] > "file."NR
  21.         delete b
  22. }
  23. 效率测试:
  24. $ cat i
  25. A[BC]D[AC]DAABACDA[AC]DDACA[BC]D[AC]DAAA[BC]DDDACB[AC]DAABCCD[AC]DCCA[BC]D[AC]DCA[BC]DACDA[BC]D[ABC]DA[BC]D[AC]DABCD[ACB]DA[BC]DACCDABCD[DC]DA[BCA]DDABCCBB

  26. $ time ./a i

  27. real    0m0.144s
  28. user    0m0.015s
  29. sys     0m0.015s

  30. $ cat file.1
  31. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADABDACCDABCDDDABDDABCCBB
  32. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADABDACCDABCDDDACDDABCCBB
  33. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADABDACCDABCDDDAADDABCCBB
  34. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADABDACCDABCDCDABDDABCCBB
  35. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADABDACCDABCDCDACDDABCCBB
  36. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADABDACCDABCDCDAADDABCCBB
  37. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADACDACCDABCDDDABDDABCCBB
  38. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADACDACCDABCDDDACDDABCCBB
  39. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADACDACCDABCDDDAADDABCCBB
  40. ABDADAABACDAADDACABDADAAABDDDACBADAABCCDADCCABDADCABDACDABDADABDADABCDADACDACCDABCDCDABDDABCCBB
复制代码
注:请使用4.0以上的awk运行~

论坛徽章:
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
5 [报告]
发表于 2014-02-09 14:50 |只看该作者
  1. [redhat@localhost ~]$ cat urfile
  2. A[BC]D[ABC]DA[BC]D
  3. [BCA][ADB]DAA[BC]
  4. A[BC]D[AC]
  5. [redhat@localhost ~]$ ls -l file*
  6. ls: file*: No such file or directory
  7. [redhat@localhost ~]$ awk -vl=10 -F '' '{for(i=0;i++<NF;){if($i=="["){s=1;continue}if($i=="]"){s=0}if(s)$i=$i","};gsub(/\[/,"{");gsub(/,]/,"}");"echo "$0 |getline a;split(a,b," ");for(n=0;n++<l;)print b[n] >"file."NR}' OFS=''  urfile
  8. sh: ABDADABD: command not found
  9. sh: BADAAB: command not found
  10. sh: ABDA: command not found
  11. [redhat@localhost ~]$ ls -l file*
  12. -rw-rw-r-- 1 redhat redhat 10 Feb  9 14:46 file.1
  13. -rw-rw-r-- 1 redhat redhat 10 Feb  9 14:46 file.2
  14. -rw-rw-r-- 1 redhat redhat 10 Feb  9 14:46 file.3
  15. [redhat@localhost ~]$ cat file.1







  16. [redhat@localhost ~]$

  17. 为什么报
  18. sh: ABDADABD: command not found
  19. sh: BADAAB: command not found
  20. sh: ABDA: command not found
  21. 而且file.*里都是空行

  22. "echo "$0 | getline a; 这里报错
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-02-09 16:55 |只看该作者
回复 4# yestreenstars


    (⊙0⊙)~  啊!! 好厉害!跑得更快了, 非常快的。

谢谢大大!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP