免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
11 [报告]
发表于 2013-10-28 11:31 |只看该作者
rdcwayx 发表于 2013-10-28 11:29
还是没看到在一条awk内搞定的。

一条是可以搞定的,但是没必要创建那么多数组,两维数组不是awk的长项。

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

满足一下斑竹要求。
  1. #!/bin/awk
  2. {
  3.         ord["A"]=1;
  4.         ord["B"]=2;
  5.         ord["C"]=3;
  6.         ord["D"]=4;
  7.         l="";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.                         l=l"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.                                 l=l""tolower(a[i]);
  27.                                 x=(x>0)?--x:0;
  28.                                 b[i]=(b[i]>0)?b[i]-1:0;
  29.                         }
  30.                         else l=l""a[i];
  31.                 }
  32.         }
  33.         m[++k]=l;
  34. }
  35. END{
  36.         for (i=k;i>0;i--)
  37.         {
  38.                 n=split(m[i],a,"");
  39.                 l="";x=0;
  40.                 for (j=1;j<=n;j++)
  41.                 {
  42.                         if (toupper(a[j])=="X")
  43.                         {
  44.                                 c[j]=5;
  45.                                 l=l"x";
  46.                         }       
  47.                         else
  48.                         {
  49.                                 if (c[j]==5) c[j]=ord[toupper(a[j])];
  50.                                 if (c[j]>0)
  51.                                 {
  52.                                         l=l""tolower(a[j]);
  53.                                         c[j]=c[j]-1;
  54.                                 }
  55.                                 else l=l""a[j];
  56.                         }
  57.                 }
  58.                 m[i]=l;
  59.         }
  60.         for (i=1;i<=k;i++) print m[i];
  61. }

复制代码
运行结果
  1. cat /tmp/chars |awk -f scripts/contaminate.awk
  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
13 [报告]
发表于 2013-10-28 12:02 |只看该作者
  1. $ cat gr33n.awk

  2. BEGIN{FS="";v["X"]=0;v["A"]=1;v["B"]=2;v["C"]=3;v["D"]=4}
  3. { for(i=1;i<=NF;i++)
  4.      {  str=i OFS NR;
  5.         a[str]=$i;
  6.         if($i=="X") {b[++j]=str;e[str]++}
  7.      }
  8. }
  9. END{for (i in b)
  10.         { split(b[i],c,OFS);
  11.           for (j=1;j<=v[a[c[1]+1 OFS c[2]]];j++) { if (a[c[1]+j OFS c[2]]!="X") {d[c[1]+j OFS c[2]]++} else {break}}
  12.           for (j=1;j<=v[a[c[1] OFS c[2]+1]];j++) { if (a[c[1] OFS c[2]+j]!="X") {d[c[1] OFS c[2]+j]++} else {break}}
  13.           for (j=1;j<=v[a[c[1]-1 OFS c[2]]];j++) { if (a[c[1]-j OFS c[2]]!="X") {d[c[1]-j OFS c[2]]++} else {break}}
  14.           for (j=1;j<=v[a[c[1] OFS c[2]-1]];j++) { if (a[c[1] OFS c[2]-j]!="X") {d[c[1] OFS c[2]-j]++} else {break}}
  15.         }
  16.     for (j=1;j<=NR;j++)
  17.        { for (i=1;i<=NF;i++)
  18.            { if (e[i OFS j]||d[i OFS j])
  19.                      { printf tolower(a[i OFS j]) }
  20.              else {printf a[i OFS j] }
  21.            }
  22.          printf ORS
  23.        }
  24. }
复制代码
  1. awk -f gr33n.awk i

  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
14 [报告]
发表于 2013-10-28 12:08 |只看该作者
思路:

1. 将所有字符导入一个两维数组 , 比如 a[ 3 OFS 4] 就是 C
2. 标记 X 的坐标到数组b,例子里会找到40个 X 的坐标, 同时标记该位置的X 在最后输出的时候要小写 (数组e)
3. 对上面40个X 的坐标的东南西北四个方向进行判断,如果符合条件,就标记为非0 (用数组d)
4. 输出结果,判断的依据是,只要数组 e 或者数组d 对应坐标的值大于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
15 [报告]
发表于 2013-10-28 12:11 |只看该作者
本帖最后由 yestreenstars 于 2013-10-28 12:12 编辑

又写了一个~借助二维数组~单脚本完成任务~
  1. [root@localhost ~]# cat i
  2. ABDCDCDCAAXCXCDCCABABDCDCDCAABXBABDCDCDCAABBCDCCAXDBBXABDCDCDCAABBCDXCCA
  3. BBCDCCABBBABXCDCDCAABBCDXCCABBBBBABDCDCDCAABBCDCCAXBBBABCDAAAXBCDADCAXXX
  4. XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
  5. AACDCCAADCABDCDCDCAABXCDXCXABCDDBABDCDCDCAABBXBXCAABBBABCDAAAXBCDADCABBB
  6. ADCAAAAAXABCDCCCCCDCABXBBCCDCCABABDCDCDCAABXBABDABDCCCAXCDCDCAAAAABBCDCC
  7. XCCCAABDCAAXXAADCCCCCCAACCAAAAAAAAAXBBDCCXACDACDAAXCBBBBBBBAAABCADDCAAXC
  8. XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
  9. [root@localhost ~]# cat a
  10. #!/bin/awk
  11. BEGIN{
  12.         FS="";
  13.         IGNORECASE=1;
  14.         a["a"]=a["A"]=1;
  15.         a["b"]=a["B"]=2;
  16.         a["c"]=a["C"]=3;
  17.         a["d"]=a["D"]=4
  18. }
  19. {
  20.         for(i=1;i<=NF;i++)b[NR,i]=$i
  21. }
  22. END{
  23.         for(i=1;i<=NR;i++){
  24.                 for(j=1;j<=NF;j++){
  25.                         if(b[i,j]=="X"){
  26.                                 for(k=j-1;k>=j-a[b[i,j-1]]&&k>=1;k--){
  27.                                         if(b[i,k]=="X")break;
  28.                                         b[i,k]=tolower(b[i,k])
  29.                                 }
  30.                                 for(k=j+1;k<=j+a[b[i,j+1]]&&k<=NF;k++){
  31.                                         if(b[i,k]=="X")break;
  32.                                         b[i,k]=tolower(b[i,k])
  33.                                 }
  34.                                 b[i,j]=tolower(b[i,j])
  35.                         }
  36.                 }
  37.         }
  38.         for(i=1;i<=NF;i++){
  39.                 for(j=1;j<=NR;j++){
  40.                         if(b[j,i]=="X"){
  41.                                 for(k=j-1;k>=j-a[b[j-1,i]]&&k>=1;k--){
  42.                                         if(b[k,i]=="X")break;
  43.                                         b[k,i]=tolower(b[k,i])
  44.                                 }
  45.                                 for(k=j+1;k<=j+a[b[j+1,i]]&&k<=NR;k++){
  46.                                         if(b[k,i]=="X")break;
  47.                                         b[k,i]=tolower(b[k,i])
  48.                                 }
  49.                                 b[j,i]=tolower(b[j,i])
  50.                         }
  51.                 }
  52.         }
  53.         for(i=1;i<=NR;i++){
  54.                 for(j=1;j<NF;j++)printf b[i,j];
  55.                 print b[i,NF]
  56.         }
  57. }
  58. [root@localhost ~]# awk -f a i
  59. aBDCDCDCaaxcxcdcCABABDCDcDcAabxbaBDCDCDCAABbCdCcaxdbbxaBDCDCDcAAbbcdxcca
  60. bBCDCCABbBabxcdcDCAAbbcdxccaBBbbBABDCDCDCAAbBcDcCaxbbbABCDAAaxbcDADCaxxx
  61. xaBCDCDCaaxbbCCDCCABAbdCdCdCAabxbaBdABACCCaxcdcdCAaBBcDcCABbbxaBDCDCDcaa
  62. aACDCCAAdCabdCDCDCAabxcdxcxaBCDdBABdCDCDCAAbbxbxcaaBBBAbCDAAaxbcDADCAbbB
  63. aDCAAAAaxaBcdCCCCCDCabxbbCcDCCAbABDcDCDCAabxbaBdABdCCCaxcdcDCaAAAABBCdcC
  64. xcccAABDcAaxxaADCCCCCcaAcCaAAAAaAAaxbbdccxacDACdAaxcbbBbBBBAAaBCADDCAaxc
  65. xaBCDCDCaaxbbCCDCCABABDCDCdCAabxbaBdABACCcaxcdcdCAaBBCDcCABbbxaBDCDCDCaA
  66. [root@localhost ~]#
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
16 [报告]
发表于 2013-10-28 13:39 |只看该作者
楼上两位的方法第一遍扫瞄数据没有作任何处理可惜了。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
17 [报告]
发表于 2013-10-28 15:07 |只看该作者
也可以试试gawk4.0's new feature: array of array

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
18 [报告]
发表于 2013-10-28 15:10 |只看该作者
sed理论上也行

论坛徽章:
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
19 [报告]
发表于 2013-10-28 15:57 |只看该作者
回复 16# damcool
没什么可不可惜的,不同人的处理方法不同,就算你在第一次遍历时就处理数据也不代表你的脚本运行起来就比别人快~

   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
20 [报告]
发表于 2013-10-28 16:12 |只看该作者
本帖最后由 damcool 于 2013-10-28 16:12 编辑
yestreenstars 发表于 2013-10-28 15:57
回复 16# damcool
没什么可不可惜的,不同人的处理方法不同,就算你在第一次遍历时就处理数据也不代表你的 ...


我不太懂O(N)分析法,不过两个三重循环+几双个单重循环+几个单重循环,应该比一个双重循环+两个单重循环慢很多吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP