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 个结果,具体取决于该计算机的活动。
我想要的是我只想看到每台计算机的一个结果而不是所有结果。我现在所做的是对它进行排序并手动删除副本,这不是很有帮助!我尝试使用诸如diff和comm 之类的命令,但没有运气(这是有道理的,因为行非常不同)。
那么,如何使用 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 之前或第一个之前的任何内容:并删除副本”
如果有任何结果,请使用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
,并将整行保存到数组中。每次遇到重复的结果时,它都会覆盖前一个条目。并且,最后,只需打印数组中的所有行,现在将只有每个系统的最后结果。