获取许多相似字符串中的第一个

时间:2019-02-05 17:52:33

标签: linux bash unix sed grep

我有以下形式的字符串

.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 ,但无法在此处设置“相似模式”。

2 个答案:

答案 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,这允许以后在同一正则表达式中引用字符串。在这种情况下,当前行开头的键将与前一行中的任何此类键匹配。