Como comparar o texto antes do caractere dado

2

Estou trabalhando com a saída de um programa semelhante a este:

[email protected]:randomtext1:completion of randomtext
[email protected]:randomtext4:completion of randomtext
[email protected]:randomtext3:completion of randomtext
[email protected]:randomtext2:completion of randomtext
[email protected]:randomtext5:completion of randomtext
[email protected]:randomtext6:completion of randomtext
[email protected]:randomtext7:completion of randomtext
[email protected]:randomtext8:completion of randomtext

Então, como você pode ver, o mesmo computador me dará mais de um resultado, mas cada resultado é diferente em termos de conteúdo e duração (mas tudo em uma linha). Alguns computadores darão apenas 1 resultado e alguns darão até 15 resultados, dependendo da atividade daquele computador.

O que eu quero é que eu gostaria de ver apenas um resultado de cada computador em vez de todos os resultados. O que eu faço agora é que eu o ordeno e excluo a réplica manualmente, o que não é muito útil! Eu tentei usar comandos como diff e comm mas sem sorte (o que faz sentido, já que as linhas são muito diferentes).

Então, como posso alterar a saída usando o terminal via para ser semelhante a este:

[email protected]:randomtext1:completion of randomtext
[email protected]:randomtext4:completion of randomtext
[email protected]:randomtext2:completion of randomtext

A idéia na minha cabeça é que talvez haja uma maneira de dizer ao terminal "Compare o que quer que seja antes do .com ou antes do primeiro: e exclua a réplica"

    
por Never.too.old.to.learn 28.03.2017 / 12:08

1 resposta

8

Se algum resultado servir, use sort e peça uma saída única:

sort -ut: -k1,1 foo

As opções:

  • -k 1,1 usa apenas o primeiro campo para classificar
  • -t: use : como separador de campos
  • -u remove duplicados da saída com base no campo de classificação

Da mesma forma, no awk:

awk -F: '!a[$1]++' foo

Em ambos os comandos, usando : como o separador de campo, estamos apenas olhando para o primeiro campo.

Esse comando awk (e, eu acho, o comando sort também) imprimirá apenas o primeiro resultado.

Para obter o último resultado:

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

Aqui, usamos o primeiro campo como um índice na matriz a e salvamos a linha inteira na matriz. Cada vez que um resultado duplicado é encontrado, ele sobrescreve a entrada anterior. E, no final, basta imprimir todas as linhas da matriz, que agora terão apenas os últimos resultados de cada sistema.

    
por muru 28.03.2017 / 12:17