免费注册 查看新帖 |

Chinaunix

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

这种情况下的字符过滤如何处理呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-24 15:37 |只看该作者 |倒序浏览
统计原则:分别统计a-t的字母个数,要求每条记录至少5个字母,最多10个字母,且字母在a-t之间惟一。如果记录中存在数字则丢弃该条记录,但是每个字母用,;。:等符号隔开应视为有效记录;
同时满足上述条件的行,如果行里的内容是相同的也为正常记录,不应该过滤掉。

abcd
Abcde
Abcde
Abcdex
Abcde0
Abcdefghijk
aAbBcCdDeEf
a,b,c,d,e,f
aAbAcAdAe
ABCDEabcde
过滤结果为

Abcde
Abcde
Abcdefghijk
a,b,c,d,e,f

论坛徽章:
0
2 [报告]
发表于 2007-12-24 15:57 |只看该作者
请大家帮忙看看

论坛徽章:
0
3 [报告]
发表于 2007-12-24 16:50 |只看该作者
原帖由 bkj 于 2007-12-24 15:37 发表
统计原则:分别统计a-t的字母个数,要求每条记录至少5个字母,最多10个字母,且字母在a-t之间惟一。如果记录中存在数字则丢弃该条记录,但是每个字母用,;。:等符号隔开应视为有效记录;
同时满足上述条件的行 ...

#!/bin/bash

FILE=~/shell/sed/cu28.txt #数据文件

while read LINE ; do
#将标点符号去掉,并将大写转成小写
TEMP=$(echo $LINE | sed 's/,//g' | tr [:upper:] [:lower:])
NUM=${#TEMP}
#转换为小写字母
CON=0
if [ ${#TEMP} -ge 5 ] && [ ${#TEMP} -le 10 ]    #只有在5-10个字符的才去判断
then
    if [ ! $(echo $TEMP | grep "[0-9U-Zu-z]" ] #不包含数字和u-z字母的才判断
    then
        #这两个for循环判断变量内有无相同的字符,如有,则将CON值设置为1,
        for((i = 0 ; i <= $NUM -1 ; i++))
        do
        TEMP1=${TEMP{i}:1}
            for ((j = i+1 ; j <= $NUM-1 ; j++)) ; do
                TEMP2=${TEMP{j}:1}
                if [ ${TEMP1} = ${TEMP2} ] ;  then
                CON=1
                fi
            done
        done
        #如果CON值为止。打印变量
        if [ ${CON} -eq 0 ] ; then
            echo $LINE
        fi
    fi
fi
done <${FILE}

论坛徽章:
0
4 [报告]
发表于 2007-12-24 16:53 |只看该作者
[code]grep -v "[0-9]" test.txt|awk '{a=length();if(a>4&&a<10) print ;}'[\code]

但是每个字母用,;。:等符号隔开应视为有效记录; 不理解

论坛徽章:
0
5 [报告]
发表于 2007-12-24 19:35 |只看该作者
语法错误

root# d.sh
./d.sh: line 11: syntax error near unexpected token `for(('
./d.sh: line 11: `       for((i = 0 ; i <= $NUM -1 ; i++)) '

root# more d.sh
#!/bin/bash
file=/tmp/test1.txt
while read LINE ; do
TEMP=$(echo $LINE | sed 's/,//g' | tr [:upper:] [:lower:])
NUM=${#TEMP}
CON=0
if [ ${#TEMP} -ge 5 ] && [ ${#TEMP} -le 10 ]
then
    if [ ! $(echo $TEMP | grep "[0-9U-Zu-z]" ]
    then
       for((i = 0 ; i <= $NUM -1 ; i++))
        do
        TEMP1=${TEMP{i}:1}
        for ((j = i+1 ; j <= $NUM-1 ; j++)) ;
        do
        TEMP2=${TEMP{j}:1}
        if [ ${TEMP1} = ${TEMP2} ] ;  
        then
        CON=1
        fi
        done
        done
        if [ ${CON} -eq 0 ] ; then
        echo $LINE
        fi
        fi
fi
done <${FILE}

论坛徽章:
0
6 [报告]
发表于 2007-12-24 19:37 |只看该作者
原帖由 frankytf 于 2007-12-24 16:53 发表
grep -v "[0-9]" test.txt|awk '{a=length();if(a>4&&a


这种做法没有考虑到过滤每行重复的字符,需要将包含重复的字符的行过滤掉,而且大小写不敏感。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
7 [报告]
发表于 2007-12-24 19:45 |只看该作者
没数错的话,Abcdefghijk是11个字母吧?为何是正常记录?

论坛徽章:
0
8 [报告]
发表于 2007-12-24 20:05 |只看该作者
原帖由 r2007 于 2007-12-24 19:45 发表
没数错的话,Abcdefghijk是11个字母吧?为何是正常记录?


楼上的说得对,这行是要过滤掉的。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2007-12-24 20:15 |只看该作者
刚要做,又发现疑问,这两个违反那条了?
aAbAcAdAe
ABCDEabcde

论坛徽章:
0
10 [报告]
发表于 2007-12-24 20:20 |只看该作者
原帖由 r2007 于 2007-12-24 20:15 发表
刚要做,又发现疑问,这两个违反那条了?
aAbAcAdAe
ABCDEabcde


出现了重复字符,因为大小写不敏感
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP