Chinaunix

标题: 精准提取 [打印本页]

作者: bmne    时间: 2017-03-24 13:28
标题: 精准提取


提取自由指定其字母及数字各自位数的行

比如:指定提取
行中只能是大小字母混合(整个行中只有小写或大写字母除外)及数字的行,并且连续字符是1-3位(最多位数3位,包含2位及1位)

  1. Kyswy10e97
  2. MAutA22fa8
  3. tet26vCWOH
  4. RExoD34ica
  5. cxyp518228
  6. xjie520lzx
  7. 55566hz206
  8. liu3668712
  9. xj800602xj
  10. BIN1981BIN
  11. 202127ABCA
  12. HUANAN2000
  13. 19850827XL
  14. QAZ1314520
  15. JANE820515
  16. yPH3O8apjg
  17. SFynE44idb
  18. ynjQnnL733
  19. 23Kwy10e97
  20. MAu4A22fa8
  21. te2t26W5OH
复制代码


输出:(上面的最后三行)
  1. 23Kwy10e97
  2. MAu4A22fa8
  3. te2t26W5OH
复制代码


辛苦!






作者: bmne    时间: 2017-03-24 15:04

????

我没说明白?怕周末人少啊


作者: elu_ligao    时间: 2017-03-24 15:07
  1. awk --re-interval '!(/[0-9]{4,}/||/[a-zA-Z]{4,}/)||/^[a-z]+$/||/^[A-Z]+$/'
复制代码


试试看是不是你想要的
作者: sunzhiguolu    时间: 2017-03-24 15:14
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Valid{
  5.         my @aT = sort {$b <=> $a} map {length} @_;
  6.         !@aT or $aT[0] > 3 ? 0 : 1;
  7. }

  8. while (<DATA>){
  9.         print if (Valid (/\d+/g) and Valid (/[a-z]+/ig));
  10. }

  11. __DATA__
  12. Kyswy10e97
  13. MAutA22fa8
  14. tet26vCWOH
  15. RExoD34ica
  16. cxyp518228
  17. xjie520lzx
  18. 55566hz206
  19. liu3668712
  20. xj800602xj
  21. BIN1981BIN
  22. 202127ABCA
  23. HUANAN2000
  24. 19850827XL
  25. QAZ1314520
  26. JANE820515
  27. yPH3O8apjg
  28. SFynE44idb
  29. ynjQnnL733
  30. 23Kwy10e97
  31. MAu4A22fa8
  32. te2t26W5OH
复制代码



试试看是不是你想要的
作者: bmne    时间: 2017-03-24 15:17
回复 4# sunzhiguolu


回复 3# elu_ligao


谢谢,谢谢

我认为周末了,大牛们都忙去了了呢

看来我表达清楚了





作者: hjfeng1988    时间: 2017-03-24 15:29
差评,题意完全让人猜。
作者: 本友会机友会摄友会    时间: 2017-03-24 15:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: haooooaaa    时间: 2017-03-24 15:31
回复 6# hjfeng1988

很久没冒泡了啊.
作者: hjfeng1988    时间: 2017-03-24 15:34
回复 8# haooooaaa

都在六神的群水着。
作者: bmne    时间: 2017-03-24 17:46
回复 6# hjfeng1988



别着急差评啊。你可能太忙,没仔细看

3楼的大牛命令完美、正确




作者: o枫叶o飘零    时间: 2017-03-24 17:57
本帖最后由 o枫叶o飘零 于 2017-03-24 18:01 编辑

回复 10# bmne

3楼的命令有些情况木有判定出来

a1a1a1a1a1
A1A1A1A1A1
AaAaAaAaAa....
AA11AA11AA11类似这种穿插情况

作者: bmne    时间: 2017-03-24 18:18
本帖最后由 bmne 于 2017-03-25 06:52 编辑

回复 11# o枫叶o飘零


请帮助下

我希望进一步给更具体的另一个命令(命令请结合1楼参看3楼)

保证提取的每一行中肯定含有3位(及同一行中含有的2位、1位)。但,在每一行中,低于3位的将不再输出

比如只输出这样的行
Agf76kj9
765gE8jt

这样的行,不再输出
jT85B89gd
V7m9wK
34A76nj





作者: zy86416779    时间: 2017-03-24 22:28
  1. [root@CentOS_6 shell]# cat d.txt | egrep "[A-Z]" | egrep "[a-z]" | egrep "[0-9]" | egrep -v "[0-9]{4,}|([a-z]|[A-Z]){4,}"
  2. 23Kwy10e97
  3. MAu4A22fa8
  4. te2t26W5OH
  5. [root@CentOS_6 shell]# cat d.txt
  6. Kyswy10e97
  7. MAutA22fa8
  8. tet26vCWOH
  9. RExoD34ica
  10. cxyp518228
  11. xjie520lzx
  12. 55566hz206
  13. liu3668712
  14. xj800602xj
  15. BIN1981BIN
  16. 202127ABCA
  17. HUANAN2000
  18. 19850827XL
  19. QAZ1314520
  20. JANE820515
  21. yPH3O8apjg
  22. SFynE44idb
  23. ynjQnnL733
  24. 23Kwy10e97
  25. MAu4A22fa8
  26. te2t26W5OH
复制代码

作者: bmne    时间: 2017-03-25 06:42


谢谢 3# elu_ligao

1、若有时间,麻烦再修改下(看图片)

  1. SF43yn22E44i8db
  2. y6n7j4Q8n5n9L7b3y3
  3. 23Kwy10e97
  4. MAu4A22fa8
  5. te2t26W5OH
  6. 123bh56m7uy89
  7. c1V3h5j7
  8. 3b5H6u7f8p
  9. 9456U78gy
  10. 72jhGD83bh
  11. 7c8f9a3k
  12. 4N2X5V
复制代码


2、若太忙,3楼的不用修改了。能给出进一步的12楼要求的最理想了



1.jpg (27.18 KB, 下载次数: 22)

1.jpg

作者: bmne    时间: 2017-03-25 06:53


命令满足要求,谢谢 13# zy86416779


请问,若有时间,麻烦给出12楼进一步的命令(更精准具体)






作者: sditmaner    时间: 2017-03-25 11:07
回复 4# sunzhiguolu
作者: sunzhiguolu    时间: 2017-03-25 11:37
我希望进一步给更具体的另一个命令(命令请结合1楼参看3楼)

保证提取的每一行中肯定含有3位及同一行中含有的2位、1位)。但,在每一行中,低于3位的将不再输出

比如只输出这样的行
Agf76kj9
765gE8jt

这样的行,不再输出
jT85B89gd
V7m9wK
34A76nj
你的处理要求能否在变化之后 像主题帖那样将新的处理要求完整的描述一下,别这里加点要求那里减少点要求 这样大家在后续的回帖中容易理解你的需求变化。
不然,需要将你每一楼层的心理需求都得分析一遍。(只是提议,望采纳)
我说下我对你的需求的理解,你看下是否满足你的处理条件。
1.> 必须同时包含 (字母 和 数字) 字符
2.> (字母 或 数字) 序列其中任一序列的长度 如: (765gE8jt) 必须满足正好是 3 个字符, 长度 > 3 或者 长度 < 3 均不满足条件

作者: bmne    时间: 2017-03-25 12:18
回复 17# sunzhiguolu



让大牛说了这么多话。不好意思

为什么又要进一步帮助另一个命令?(可看看12楼)

实话,突然感觉1楼的字符串提取后,还是没有规律可以借鉴,很乱。所以,想进一步细化,看看能否发现其中规律

要求:只提取(按要求指定字母或数字的位数)大小写字母混合并有数字的行。单一大写或小写字母加数字的行不提取

比如:
提取字母字符串或数字字符串最多位数是3位的行(每一行里面除了3位的字符串外,可以有2位及1位的字符串)。但,整个行里面必须有一个是3位的字符串,若没有则不提取该行。


  1. SF43yn22E44i8db
  2. y6n7j4Q8n5n9L7b3y3
  3. 23Kwy10e97
  4. MAu4A22fa8
  5. te2t26W5OH
  6. 123bh56m7uy89
  7. c1V3h5j7
  8. 3b5H6u7f8p
  9. 9456U78gy
  10. 72jhGD83bh
  11. 7c8f9a3k
  12. 4N2X5V
复制代码


输出

  1. 23Kwy10e97
  2. MAu4A22fa8
复制代码




这样,应该是能看明白了估计


谢谢




作者: sunzhiguolu    时间: 2017-03-25 12:37
回复 18# bmne
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Valid{
  5.     return 0 if (!@_);
  6.     length ($_[-1]) ? 0 : 1;
  7. }

  8. while (<DATA>){
  9.     next if (/[A-Z]/ + /[a-z]/ == 1);
  10.     print if (Valid (/(\d{3})(\d?)/) or /\d/ and Valid (/([a-z]{3})([a-z]?)/i));
  11. }

  12. __DATA__
  13. SF43yn22E44i8db
  14. y6n7j4Q8n5n9L7b3y3
  15. 23Kwy10e97
  16. MAu4A22fa8
  17. te2t26W5OH
  18. 123bh56m7uy89
  19. c1V3h5j7
  20. 3b5H6u7f8p
  21. 9456U78gy
  22. 72jhGD83bh
  23. 7c8f9a3k
  24. 4N2X5V

复制代码




作者: bmne    时间: 2017-03-25 13:01
回复 19# sunzhiguolu


谢谢

借鉴一下你的。可还是 算不过账来
没成功

cat b.txt|egrep '[A-Z]'|egrep '[a-z]'|egrep '[0-9]'|egrep  '(\d{3})(\d?)|([a-z]|[A-Z]){3}([a-z]?|[A-Z]?)'




作者: sunzhiguolu    时间: 2017-03-25 13:56
回复 20# bmne
别图省事,把你的条件通过 管道 + 过滤 一步一步表达出来就得出结果了。
  1. cat f | grep '[A-Z]' | grep '[a-z]' | grep '[0-9]' | grep -Ei '\d{3}|[a-z]{3}' | grep -Eiv '\d{4}|[a-z]{4}'
复制代码




作者: zy86416779    时间: 2017-03-25 16:58
回复 15# bmne
  1. [root@CentOS_6 shell]# cat e.txt |  egrep "[A-Z]" | egrep "[a-z]" | egrep "[0-9]" | egrep -v "[0-9]{4,}|([a-z]|[A-Z]){4,}" | egrep  "([a-z]|[A-Z]){3}|[0-9]{3}"
  2. 23Kwy10e97
  3. MAu4A22fa8
复制代码




作者: bmne    时间: 2017-03-25 18:26
回复 21# sunzhiguolu


谢谢。辛苦

作者: bmne    时间: 2017-03-25 18:28
回复 22# zy86416779



谢谢

看来只能这样一步一步来。写出个短命令看来有难度

感谢



作者: elu_ligao    时间: 2017-03-27 11:10
  1. 。。。需求确实要描述清楚,现在我的理解是:
  2. 1、同时匹配大小写字母及数字三种字符
  3. 2、连续的字母长度或连续的数字长度不能超过3,即<=3
  4. 3、必须要存在连续的字母或连续的数字的长度等于3
  5. 另外, 你1楼的那个括号里的全是大写或小写除外就别提了, 除非这是特殊情况, 是你要的结果, 因为我起初就好像是误解了这是你要的结果
  6. awk --re-interval '/[0-9]/&&/[a-z]/&&/[A-Z]/&&!(/[0-9]{4,}/||/[a-zA-Z]{4,}/)&&(/[0-9]{3}/||/[a-zA-Z]{3}/)'
复制代码

作者: bmne    时间: 2017-03-27 12:25
回复 25# elu_ligao


谢谢大牛。耽误你时间了

完全正确








欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2