我有以下形式的字符串
.join()
但是,我想让每个字符串的第一个出现在连字符之前。因此,这里的解决方案是:
const removeDuplicates = (str, r = a => a.reverse().join``) =>
r([...r([...str]).replace(/([a-z])(?=\1|.*\1)/ig,'')]);
console.log(removeDuplicates("FoxfoXtAg"));
如何使用bash工具执行此操作?我尝试了A-XXX
A-YYY
B-NNN
A-ZZZ
B-MMM
C-DDD
,但无法在此处设置“相似模式”。
答案 0 :(得分: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执行以下命令(默认不打印任何内容),并递增数组以检查是否看到值。
答案 1 :(得分:0)
这可能对您有用(GNU sed):
sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file
通常的想法是将当前行与所有先前的行进行比较,并使用模式匹配,只有在先前键上没有匹配项时才打印当前行。
第一行将始终被打印。从第二行开始,使用G
命令将前几行附加到当前行,如果没有键匹配,则使用P
命令仅打印第一行或当前行/^\(^-]*-\).*\n\1/!
命令。然后,使用h
命令将当前行和附加行存储在保留空间中,为下一行做好准备。
键从一行的开始到每个字符-
为止都由字符定义。因此,正则表达式^[^-]*-
与这样的密钥匹配。还要注意,密钥是作为一组\(...\)
收集的,以后又称为\1
,这允许以后在同一正则表达式中引用字符串。在这种情况下,当前行开头的键将与前一行中的任何此类键匹配。