Linux 获取许多类似字符串中的第一个
我有这样的字符串Linux 获取许多类似字符串中的第一个,linux,bash,unix,sed,grep,Linux,Bash,Unix,Sed,Grep,我有这样的字符串 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
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-是字段分隔符!一个[$1]告诉awk执行以下命令,默认情况下不执行任何给定的打印,并对检查是否看到值的数组进行增量后处理。这就足够了吗
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-是字段分隔符!一个[$1]告诉awk执行以下命令,默认情况下不执行任何给定的打印,并对检查是否看到值的数组进行增量后处理。这可能适用于GNU-sed:
sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file
一般的想法是将当前行与所有以前的行进行比较,并且通过使用模式匹配,仅当上一个键上没有匹配项时才打印当前行
将始终打印第一行。从第二行开始,使用G命令将前几行追加到当前行,如果使用/^\^-]*-\.\n\1/!键不匹配,则仅使用P命令打印第一行或当前行!命令然后,使用h命令将当前行和附加行存储在保留空间中,为下一行做好准备
注意:键由一行开头的字符定义,包括字符-。因此,regexp^[^-]*-匹配这样一个键。还要注意的是,密钥被收集为一个组\…\,之后被引用为\1。这允许在同一个regexp中的稍后点引用字符串。在这种情况下,当前行开头的键与前几行中的任何此类键匹配。这可能适用于GNU-sed:
sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file
一般的想法是将当前行与所有以前的行进行比较,并且通过使用模式匹配,仅当上一个键上没有匹配项时才打印当前行
将始终打印第一行。从第二行开始,使用G命令将前几行追加到当前行,如果使用/^\^-]*-\.\n\1/!键不匹配,则仅使用P命令打印第一行或当前行!命令然后,使用h命令将当前行和附加行存储在保留空间中,为下一行做好准备
注意:键由一行开头的字符定义,包括字符-。因此,regexp^[^-]*-匹配这样一个键。还要注意的是,密钥被收集为一个组\…\,之后被引用为\1。这允许在同一个regexp中的稍后点引用字符串。在这种情况下,当前行开头的键与前几行中的任何此类键匹配。是的,匹配!非常感谢你,我真的应该更多地学习awk;你真的应该!是的,是的!非常感谢你,我真的应该更多地学习awk;你真的应该!