我想从文本文件中查找所有词汇(它从真正的电子书转换而来,所以可能更大,解决方案需要高效(,我将词汇输出到一个名为voclist的文本文件中。但是仍然有一些非法的词我想删除它,例如(aa,aazzz(。
我试过"egrep [a-z]+ voclist"。当然,这是行不通的。
This is the block contain illegal words:
2 accepting
2 absence
1 zz
1 yyybb
1 yarn
I want output like this:
2 accepting
2 absence
1 yarn
这个问题我想了很多次。删除"yyybb"并保持"接受"的同时可能有点困难,而"yyybb"在真正的电子书中很少出现,因此我们可以删除"zz"。有人知道吗?
假设inputfile
包含:
2 accepting
2 absence
1 zz
1 yyybb
1 yarn
要获取包含两个或更多重复字符的单词列表,请执行以下操作:
$ egrep "(w)w*1" inputfile
2 accepting
2 absence
1 zz
1 yyybb
要过滤非法单词,您可以使用字典,例如
$ cat dictionary
accepting
absence
并与它进行比较:
$ egrep "(w)w*1" inputfile | grep -f dictionary
2 accepting
2 absence
你的格式有点不方便。看起来它来自sort
和uniq -c
的组合.为简化起见,我将采用以下输入格式:
accepting
absence
zz
yyybb
yarn
用有点长的方式,你可以写:
$ grep -v -e '^.$' # single char
-e '^(.)1$' # single repeated char (e.g. zzzz)
-e '(.)1+' # repeated char (3 or more times)
-e '^[aeiou]+$' # only vowels
-e '^[bcdfghjklmnpqrstvwxyz]+$' # only consonants
file
我们利用grep
,因为它支持匹配部分中的反向引用。 awk 不允许的事情。
现在可以在原始格式上使用它,如下所示:
awk '{print $2}' file
| grep -v -e '^.$' -e '^(.)1$' -e '(.)1+'
-e '^[aeiou]+$' -e '^[bcdfghjklmnpqrstvwxyz]+$'
| grep -wFf - file