0

好的,我遇到了这个问题,我有一个 md5 列表和旁边的一个单词,用空格分隔,我需要过滤掉一些行。

示例片段:

...
F08A4C9263AD215D70B9C216F0B385CB wrapup
7B286E6F0615D64ACD4A7BC3578871DD wrath
8E35BA3D27A7730840EB1694386F69A0 wrathful
096762EA6790EDA22BF2369347FD53AC wreak
56AC6677205EB591A7173BADBB610F5C wreath
A85C0CB6C0367AF9D23442DF56EC9E1C wreathe
9E44AAE612306D44B91C4162DB5C26B7 wreck
6D9C795CBB3075DC1A482F6F78DC6D68 wreckage
BD907BC4DC65934D133BD5C472B78CC0 wrench
758C70E9B6F437D49D98D92E28E95939 wrest
81A4471F73DFDA0B534F58F4E1501FAB wrestle
94183CC7C7A66338DE89DB9C7460A8A2 wretch
AFEED5CE5BACCEC17EC54E68A97CCD0F wriggle
...

我需要一个(e)grep的正则表达式,它会拉出每个字母(所以 [AF])最多只出现 2 次的每一行。所以一个例子是:

4F2048B829C2834A23832F28928DE38E turtle

如果有人可以帮助我,我将非常感激!

4

2 回答 2

1

你可以使用:

egrep -v "^\S*([A-F])\S*\1\S*\1" inputfile

这将列出不包括在同一行中重复三次的字母 AF 的每一行。

编辑:更改以避免匹配单词中的大写字符...

于 2013-01-02T15:41:04.347 回答
0

你提到:

拉出每个字母(因此 [AF])最多只出现 2 次的每一行。

所以我的理解是,选择的行应该包含0-2 [AF]。基于此,以下 awk oneliner 应该可以完成这项工作:

awk  'BEGIN{FS=""}{delete a;for(i=1;i<=NF;i++)if($i~/[A-F]/){a[$i]++;if(a[$i]>2)next}}1' file

测试

请注意,给定的输入没有满足您的要求的行。所以我在末尾添加了“乌龟”行:

kent$  echo "F08A4C9263AD215D70B9C216F0B385CB wrapup
7B286E6F0615D64ACD4A7BC3578871DD wrath
8E35BA3D27A7730840EB1694386F69A0 wrathful
096762EA6790EDA22BF2369347FD53AC wreak
56AC6677205EB591A7173BADBB610F5C wreath
A85C0CB6C0367AF9D23442DF56EC9E1C wreathe
9E44AAE612306D44B91C4162DB5C26B7 wreck
6D9C795CBB3075DC1A482F6F78DC6D68 wreckage
BD907BC4DC65934D133BD5C472B78CC0 wrench
758C70E9B6F437D49D98D92E28E95939 wrest
81A4471F73DFDA0B534F58F4E1501FAB wrestle
94183CC7C7A66338DE89DB9C7460A8A2 wretch
AFEED5CE5BACCEC17EC54E68A97CCD0F wriggle
4F2048B829C2834A23832F28928DE38E turtle"|awk  'BEGIN{FS=""}{delete a;for(i=1;i<=NF;i++)if($i~/[A-F]/){a[$i]++;if(a[$i]>2)next}}1'                          
4F2048B829C2834A23832F28928DE38E turtle
于 2013-01-02T15:49:57.583 回答