八个字符的模式识别

时间:2014-04-24 16:54:14

标签: linux perl awk sed

我在文件中有模式列表。该模式由8个字符组成,由0,1,2或3组合而成。我只想grep那些包含至少5个3和3的字符,其余的是2' s。字符顺序无关紧要,即它可以grep 33333333,333333222,32323333和其他组合。

文件1

33333333
22333333
23232333
13323332
22233333
22323233
10111111

输出

33333333
22333333
23232333
13323332
22233333

你能否建议我在linux,awk,sed,perl中使用任何命令。感谢

3 个答案:

答案 0 :(得分:4)

这将按照你的要求行事。它使用tr///来计算字符数,并且只有在至少有五个3且没有10时才会打印该行(所以其余的必须是2 S)

perl -ne 'print if tr/3// >= 5 and tr/10// == 0' myfile.txt

答案 1 :(得分:2)

简单地计算角色是更清晰,更不脆弱。

然而,作为比较点,这是一个正则表达式解决方案。即使这个更短,我仍然会投票支持另一个。

perl -ne 'print if /^(2*3){5}[23]*$/' myfile.txt

更新 - 正则表达式细分

use strict;
use warnings;

while (<DATA>) {
    if (m{
        ^           # Anchor at start of string
        (
            2*      # Any number of 2's
            3       # followed by a 3.
        ){5}        # group repeated 5 times. (ensures we have at least 5 3's)
        [23]*       # Any number of 2 or 3's
        $           # Anchor at end of string
    }x) {
        print;
    }

}

__DATA__
33333333
22333333
23232333
13323332
22233333
22323233
10111111

输出:

33333333
22333333
23232333
22233333

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -n 'h;s/3/&/5;T;s/[23]//g;/^$/{g;p}' file

复制该行,帐户为五个3,删除所有32&#39; s,如果该行为空检索复制的行并打印出来。