免费注册 查看新帖 |

Chinaunix

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

[文本处理] 以 [小写字符] 标示出杂质 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-26 14:45 |只看该作者 |倒序浏览
本帖最后由 gr33n 于 2013-10-26 11:47 编辑

各位大大好:

1:
一个纯净的字符串, 是由字符 A, B, C, D 字符组成的。如:
ABDCDCDC

2:
一个不纯净的字符串, 是由字符 A, B, C, D, X 字符组成的。如:
ABDCDCDCXABBXXAA

3: 污染物 X 字符:
[考虑横向时:] 污染物 X 字符旁边是
A: 1 字符被X污染, AXA...是杂质。
B: 2 字符被X污染, AXBB, BBXA, ABXBB....是杂质。
C: 3 字符被X污染, AXCCC, ABCXCAB, CCCXCBB, ABXCBA....是杂质。
D: 4 字符被X污染, ABCDXDAAA, AXDCCC, ABXDDDD...是杂质。       

污染不会穿透 X:
AXDXAB
杂质为:AXDXA
不是:AXDXAB

4:
标示出杂质, [ 同时考虑 X 横向, 垂直向 ] 的污染                
一个不纯净的字符串组。如:


ABCABCDD
ABCXABBD
CCCCBBAA
DCAABCCX

结果以 [小写字符] 标示出杂质。如:

ABCaBCDD
abcxaBBD
CCCcBBAa
DCAabccx




各位大大能不能给我这个标示的脚本 ?

相等长度字符串组:
ABDCDCDCAAXCXCDCCABABDCDCDCAABXBABDCDCDCAABBCDCCAXDBBXABDCDCDCAABBCDXCCA
BBCDCCABBBABXCDCDCAABBCDXCCABBBBBABDCDCDCAABBCDCCAXBBBABCDAAAXBCDADCAXXX
XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
AACDCCAADCABDCDCDCAABXCDXCXABCDDBABDCDCDCAABBXBXCAABBBABCDAAAXBCDADCABBB
ADCAAAAAXABCDCCCCCDCABXBBCCDCCABABDCDCDCAABXBABDABDCCCAXCDCDCAAAAABBCDCC
XCCCAABDCAAXXAADCCCCCCAACCAAAAAAAAAXBBDCCXACDACDAAXCBBBBBBBAAABCADDCAAXC
XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA

输出为: ?

论坛徽章:
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
2 [报告]
发表于 2013-10-26 18:58 |只看该作者
楼主之前在Perl版发的那题被我转来本版了,你的题目都有一个共同点,第一次看时都是看不懂,要看好几遍才能看懂~废话不多说,先来看看我的代码是否能帮到你~
  1. #楼主给的数据
  2. [root@localhost ~]# cat i
  3. ABDCDCDCAAXCXCDCCABABDCDCDCAABXBABDCDCDCAABBCDCCAXDBBXABDCDCDCAABBCDXCCA
  4. BBCDCCABBBABXCDCDCAABBCDXCCABBBBBABDCDCDCAABBCDCCAXBBBABCDAAAXBCDADCAXXX
  5. XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
  6. AACDCCAADCABDCDCDCAABXCDXCXABCDDBABDCDCDCAABBXBXCAABBBABCDAAAXBCDADCABBB
  7. ADCAAAAAXABCDCCCCCDCABXBBCCDCCABABDCDCDCAABXBABDABDCCCAXCDCDCAAAAABBCDCC
  8. XCCCAABDCAAXXAADCCCCCCAACCAAAAAAAAAXBBDCCXACDACDAAXCBBBBBBBAAABCADDCAAXC
  9. XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA

  10. #awk脚本1(用于横向标示杂质)
  11. [root@localhost ~]# cat a1
  12. #!/bin/awk -f
  13. BEGIN{
  14.         FS=OFS="";
  15.         IGNORECASE=1;
  16.         a["a"]=a["A"]=1;
  17.         a["b"]=a["B"]=2;
  18.         a["c"]=a["C"]=3;
  19.         a["d"]=a["D"]=4;
  20. }
  21. {
  22.         for(i=1;i<=NF;i++){
  23.                 if($i=="X"){
  24.                         for(j=i-1;j>=i-a[$(i-1)]&&j>=1;j--){
  25.                                 if($j=="X")break;
  26.                                 $j=tolower($j)
  27.                         }
  28.                         for(j=i+1;j<=i+a[$(i+1)]&&j<=NF;j++){
  29.                                 if($j=="X")break;
  30.                                 $j=tolower($j)
  31.                         }
  32.                         $i=tolower($i)
  33.                 }
  34.         }
  35. }
  36. 1

  37. #awk脚本2(用于行列转换)
  38. [root@localhost ~]# cat a2
  39. #!/bin/awk -f
  40. BEGIN{
  41.         FS=""
  42. }
  43. {
  44.         for(i=1;i<=NF;i++)a[i]=a[i]$i
  45. }
  46. END{
  47.         for(i=1;i<=NF;i++)print a[i]
  48. }

  49. #运行方法和结果(运行前先赋予脚本a1和a2可执行权限)
  50. [root@localhost ~]# ./a1 i | ./a2 | ./a1 | ./a2
  51. aBDCDCDCaaxcxcdcCABABDCDcDcAabxbaBDCDCDCAABbCdCcaxdbbxaBDCDCDcAAbbcdxcca
  52. bBCDCCABbBabxcdcDCAAbbcdxccaBBbbBABDCDCDCAAbBcDcCaxbbbABCDAAaxbcDADCaxxx
  53. xaBCDCDCaaxbbCCDCCABAbdCdCdCAabxbaBdABACCCaxcdcdCAaBBcDcCABbbxaBDCDCDcaa
  54. aACDCCAAdCabdCDCDCAabxcdxcxaBCDdBABdCDCDCAAbbxbxcaaBBBAbCDAAaxbcDADCAbbB
  55. aDCAAAAaxaBcdCCCCCDCabxbbCcDCCAbABDcDCDCAabxbaBdABdCCCaxcdcDCaAAAABBCdcC
  56. xcccAABDcAaxxaADCCCCCcaAcCaAAAAaAAaxbbdccxacDACdAaxcbbBbBBBAAaBCADDCAaxc
  57. xaBCDCDCaaxbbCCDCCABABDCDCdCAabxbaBdABACCcaxcdcdCAaBBCDcCABbbxaBDCDCDCaA
复制代码
说一下我的思路:
1.先将杂质横向标示出来,把FS和OFS都设置为空以便遍历每个字母和输出,再将脚本设置为忽略大小写以便后面转化为小写字母后不影响if语句判断,然后根据楼主的要求,对A、B、C、D的大小写分别存入数组并赋值,然后从第一个字段开始遍历每个字段,如果该字段为X或x(这就是为什么要设置忽略大小写的原因)就从左边的字段开始,根据字段对应的数组a的值来判断有多少个被感染了,然后将感染的转化为小写字母,如果遇到X就停止循环,再从右边的字段开始判断,判断方法同上,最后将X转化为x;
2.对转化后的结果进行行列转换;
3.对行列转换后的结果进行横向标示杂质;
4.最后再将结果转换回来。

论坛徽章:
0
3 [报告]
发表于 2013-10-27 10:30 |只看该作者
啊!! 好厉害!谢谢!
结果出来的是正确的.

回复 2# yestreenstars


   

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2013-10-28 07:24 |只看该作者
厉害的, 四个小时之内搞定。 还难倒perl/ruby 板块的同学。

http://bbs.chinaunix.net/thread-4103214-1-1.html
http://bbs.chinaunix.net/thread-4103213-1-1.html

论坛徽章:
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
5 [报告]
发表于 2013-10-28 09:03 |只看该作者
回复 4# rdcwayx
一开始看不懂时打算放弃的,然后跑去打游戏了,打了一段时间后再回来看看,突然就懂了,呵呵,然后就开始写代码了~

   

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
6 [报告]
发表于 2013-10-28 09:08 |只看该作者
看懂题目是关键,我表示一时半会儿没看懂

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2013-10-28 09:21 |只看该作者
太高级,看不懂,很专业的问题啊。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
8 [报告]
发表于 2013-10-28 09:30 |只看该作者
本帖最后由 rdcwayx 于 2013-10-28 14:09 编辑

看第二页的十三楼

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
9 [报告]
发表于 2013-10-28 10:08 |只看该作者
本帖最后由 damcool 于 2013-10-29 07:54 编辑

凑凑热闹,来个行列统一版。
  1. #!/bin/awk
  2. {
  3.         ord["A"]=1;
  4.         ord["B"]=2;
  5.         ord["C"]=3;
  6.         ord["D"]=4;
  7.         x=0;
  8.         n=split($0,a,"");
  9.         for (i=1;i<=n;i++)
  10.         {
  11.                 if (toupper(a[i])=="X")
  12.                 {
  13.                         x=ord[a[i+1]];
  14.                         b[i]=5;
  15.                         printf "x";
  16.                 }
  17.                 else
  18.                 {
  19.                         if (b[i]==5) b[i]=ord[toupper(a[i])];
  20.                         a1=a[i]a[i+1]
  21.                         a2=a[i]a[i+1]a[i+2]
  22.                         a3=a[i]a[i+1]a[i+2]a[i+3]
  23.                         a4=a[i]a[i+1]a[i+2]a[i+3]a[i+4]
  24.                         if (x>0 || b[i]>0 || match(a1,/[A-D]X/) || match(a2,/[A-D][B-D]X/) || match(a3,/[A-D][A-D][C-D]X/) || match(a4,/[A-D][A-D][A-D]DX/))
  25.                         {
  26.                                 printf tolower(a[i]);
  27.                                 x=(x>0)?--x:0;
  28.                                 b[i]=(b[i]>0)?b[i]-1:0;
  29.                         }
  30.                         else printf a[i];
  31.                 }
  32.         }
  33.         printf "\n";x=0;
  34. }
复制代码
运行方式及结果:
  1. cat /tmp/chars |awk -f scripts/contaminate.awk|tac|awk -f scripts/contaminate.awk|tac
  2. aBDCDCDCaaxcxcdcCABABDCDcDcAabxbaBDCDCDCAABbCdCcaxdbbxaBDCDCDcAAbbcdxcca
  3. bBCDCCABbBabxcdcDCAAbbcdxccaBBbbBABDCDCDCAAbBcDcCaxbbbABCDAAaxbcDADCaxxx
  4. xaBCDCDCaaxbbCCDCCABAbdCdCdCAabxbaBdABACCCaxcdcdCAaBBcDcCABbbxaBDCDCDcaa
  5. aACDCCAAdCabdCDCDCAabxcdxcxaBCDdBABdCDCDCAAbbxbxcaaBBBAbCDAAaxbcDADCAbbB
  6. aDCAAAAaxaBcdCCCCCDCabxbbCcDCCAbABDcDCDCAabxbaBdABdCCCaxcdcDCaAAAABBCdcC
  7. xcccAABDcAaxxaADCCCCCcaAcCaAAAAaAAaxbbdccxacDACdAaxcbbBbBBBAAaBCADDCAaxc
  8. xaBCDCDCaaxbbCCDCCABABDCDCdCAabxbaBdABACCcaxcdcdCAaBBCDcCABbbxaBDCDCDCaA
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
10 [报告]
发表于 2013-10-28 11:29 |只看该作者
还是没看到在一条awk内搞定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP