我有如下形式的字符串
A-XXX
A-YYY
B-NNN
A-ZZZ
B-MMM
C-DDD
不过,我想连字符之前每个字符串的第一次出现。所以这里的解决办法是:
A-XXX
B-NNN
C-DDD
我怎样才能做到这一点使用bash工具?我试过uniq
,但我不能设置“相似度模式”出现。
这是否会足够?
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执行如下命令(什么也没有给定的打印是默认值),和后增量,检查值是否被视为阵列。
这可能会为你工作(GNU SED):
sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file
总的想法是比较以前所有的线条和使用模式匹配当前行,只打印当前行,如果有一个以前的密钥不匹配。
第一行总是被打印。从第二行起,前一行(一个或多个)被附加到当前行,使用G
命令和使用命令P
如果存在使用/^\(^-]*-\).*\n\1/!
命令没有密钥匹配所述第一或电流线仅印刷。当前行和所附线(S)然后被存储在保持空间中,使用h
命令,准备下一行。
注:该密钥由字符从行的开头所定义,高达并包括字符-
。因此,正则表达式匹配^[^-]*-
这样的密钥。另外请注意,密钥被收集为一组\(...\)
和以后引用作为\1
这允许字符串在同一正则表达式稍后提及。在这种情况下,在当前行的开头的密钥与在以前的行任何这样的键相匹配。