如何在给定字符之前比较文本

Nev*_*arn 1 command-line text-processing

我正在处理如下所示的程序输出:

Computer1@domain.com:randomtext1:completion of randomtext
Computer2@domain.com:randomtext4:completion of randomtext
Computer1@domain.com:randomtext3:completion of randomtext
Computer3@domain.com:randomtext2:completion of randomtext
Computer2@domain.com:randomtext5:completion of randomtext
Computer1@domain.com:randomtext6:completion of randomtext
Computer3@domain.com:randomtext7:completion of randomtext
Computer2@domain.com:randomtext8:completion of randomtext
Run Code Online (Sandbox Code Playgroud)

所以如你所见,同一台电脑会给我不止一个结果,但是每个结果在内容和长度上都是不同的(但都在一行中)。有些计算机只会给出 1 个结果,有些计算机会给出多达 15 个结果,具体取决于该计算机的活动。

我想要的是我只想看到每台计算机的一个结果而不是所有结果。我现在所做的是对它进行排序并手动删除副本,这不是很有帮助!我尝试使用诸如diffcomm 之类的命令,但没有运气(这是有道理的,因为行非常不同)。

那么,如何使用 via 终端将输出更改为与此类似:

Computer1@domain.com:randomtext1:completion of randomtext
Computer2@domain.com:randomtext4:completion of randomtext
Computer3@domain.com:randomtext2:completion of randomtext
Run Code Online (Sandbox Code Playgroud)

我脑子里的想法是,也许有一种方法可以告诉终端“比较 .com 之前或第一个之前的任何内容:并删除副本”

mur*_*uru 7

如果有任何结果,请使用sort并要求唯一输出:

sort -ut: -k1,1 foo
Run Code Online (Sandbox Code Playgroud)

选项:

  • -k 1,1 只使用第一个字段进行排序
  • -t:使用:作为字段分隔符
  • -u 根据排序字段从输出中删除重复项

同样,在 awk 中:

awk -F: '!a[$1]++' foo
Run Code Online (Sandbox Code Playgroud)

在这两个命令中,:作为字段分隔符,我们只查看第一个字段。

这个awk命令(我认为sort还有这个命令)将只打印第一个结果。

要获得最后的结果:

awk -F: '{a[$1] = $0} END {for (i in a) print a[i]}'
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用第一个字段作为数组的索引a,并将整行保存到数组中。每次遇到重复的结果时,它都会覆盖前一个条目。并且,最后,只需打印数组中的所有行,现在将只有每个系统的最后结果。