首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >高级“`uniq`”与“独特的部件正则表达式”

高级“`uniq`”与“独特的部件正则表达式”
EN

Stack Overflow用户
提问于 2014-10-29 06:47:58
回答 3查看 2.5K关注 0票数 3

uniq是一个工具,它允许一次过滤文件中的行,从而只显示唯一的行。uniq支持指定两行什么时候是“等效的”,但是选项是有限的。

我正在寻找一个uniq上的工具/扩展,它允许输入正则表达式。如果捕获的组对于两行是相同的,那么这两行就被认为是“等效的”。每个等价类只返回“第一个匹配”。

示例

file.dat

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo!bar!baz
!baz!quix
!bar!foobar
ID!baz!

使用grep -P '(!\w+!)' -o,可以提取“唯一的部分”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!bar!
!baz!
!bar!
!baz!

这意味着,第一行被认为与第三行“等价”,第二行与第四行相同。因此,只有第一和第二打印(第三和第四被忽略)。

然后uniq '(!\w+!)' < file.dat应该返回:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo!bar!baz
!baz!quix
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-29 07:19:21

不是使用uniq,而是使用gnu-awk,您可以获得所需的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数。
票数 2
EN

Stack Overflow用户

发布于 2014-10-29 07:20:52

下面是一个简单的Perl脚本,它将完成以下工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env perl
use strict;
use warnings;

my $re = qr($ARGV[0]);

my %matches;
while(<STDIN>) {
    next if $_ !~ $re;
    print if !$matches{$1};
    $matches{$1} = 1;
}

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./uniq.pl '(!\w+!)' < file.dat
foo!bar!baz
!baz!quix

在这里,我使用$1来匹配第一个提取的组,但是您可以用$&替换它来使用整个模式匹配。

此脚本将筛选出与正则表达式不匹配的行,但如果需要不同的行为,则可以对其进行调整。

票数 2
EN

Stack Overflow用户

发布于 2014-10-29 07:25:08

您只需使用grepsort即可完成此操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DATAFILE=file.dat

for match in $(grep -P '(!\w+!)' -o "$DATAFILE" | sort -u); do 
  grep -m1 "$match" "$DATAFILE";
done

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo!bar!baz
!baz!quix
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26633425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文