我在文件中有模式列表。该模式由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中使用任何命令。感谢
答案 0 :(得分:4)
这将按照你的要求行事。它使用tr///
来计算字符数,并且只有在至少有五个3
且没有1
或0
时才会打印该行(所以其余的必须是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
,删除所有3
和2
&#39; s,如果该行为空检索复制的行并打印出来。