获得第一个许多类似的字符串

问题描述 投票:1回答:2

我有如下形式的字符串

A-XXX
A-YYY
B-NNN
A-ZZZ
B-MMM
C-DDD

不过,我想连字符之前每个字符串的第一次出现。所以这里的解决办法是:

A-XXX
B-NNN
C-DDD

我怎样才能做到这一点使用bash工具?我试过uniq,但我不能设置“相似度模式”出现。

linux bash unix sed grep
2个回答
5
投票

这是否会足够?

cat uwe
A-XXX
A-YYY
B-NNN
A-ZZZ
B-MMM
C-DDD
$ awk -F'-' '!a[$1]{print $0;a[$1]++}' uwe
A-XXX
B-NNN
C-DDD

编辑:

可以真正缩短,要稍微更神秘:

$ awk -F'-' '!a[$1]++' uwe
A-XXX
B-NNN
C-DDD

我们要做的就是要告诉AWK -是字段分隔符; !a[$1]告诉AWK执行如下命令(什么也没有给定的打印是默认值),和后增量,检查值是否被视为阵列。


0
投票

这可能会为你工作(GNU SED):

sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file

总的想法是比较以前所有的线条和使用模式匹配当前行,只打印当前行,如果有一个以前的密钥不匹配。

第一行总是被打印。从第二行起,前一行(一个或多个)被附加到当前行,使用G命令和使用命令P如果存在使用/^\(^-]*-\).*\n\1/!命令没有密钥匹配所述第一或电流线仅印刷。当前行和所附线(S)然后被存储在保持空间中,使用h命令,准备下一行。

注:该密钥由字符从行的开头所定义,高达并包括字符-。因此,正则表达式匹配^[^-]*-这样的密钥。另外请注意,密钥被收集为一组\(...\)和以后引用作为\1这允许字符串在同一正则表达式稍后提及。在这种情况下,在当前行的开头的密钥与在以前的行任何这样的键相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.