Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 获取许多类似字符串中的第一个_Linux_Bash_Unix_Sed_Grep - Fatal编程技术网

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;你真的应该!