uniq
是一个工具,可以一次过滤文件中的行,以便仅显示唯一的行。uniq
有一些支持来指定两条线何时“等效”,但选项有限。
我正在寻找一个工具/扩展uniq
允许人们输入正则表达式。如果两条线捕获的组相同,则两条线被视为“等效”。对于每个等价类,仅返回“第一个匹配项”。
Example:
file.dat
:
foo!bar!baz
!baz!quix
!bar!foobar
ID!baz!
Using grep -P '(!\w+!)' -o
,可以提取“独特部分”:
!bar!
!baz!
!bar!
!baz!
这意味着第一行被认为与第三行“等效”,第二行被认为与第四行“等效”。因此,仅打印第一个和第二个(第三个和第四个被忽略)。
Then uniq '(!\w+!)' < file.dat
应该返回:
foo!bar!baz
!baz!quix
不使用uniq
但使用 gnu-awk 你可以获得你想要的结果:
awk -v re='![[:alnum:]]+!' 'match($0, re, a) && !(a[0] in p) {p[a[0]]; print}' file
foo!bar!baz
!baz!quix
- 使用命令行变量传递所需的正则表达式
-v re=...
-
match
函数匹配每行的正则表达式并返回匹配的文本[a]
- 每次
match
成功后,我们将匹配的文本存储在关联数组中p
并打印
- 从而有效地得到
uniq
功能与regex
support
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)