Aqui está uma maneira divertida de fazer isso em vi (ou, na verdade, em ex se você omitir os dois pontos principais de cada comando):
:%!awk -F: '{a[$1];print} END {for (i in a) {print i}}'
:v/:/m0
:%!sort -st: -k1,1
:%s/^.*:/\t/
Explicação:
O comando Awk imprime todas as linhas como estão e copia uma lista de todos os primeiros campos exclusivos no final do arquivo.
O v command m oves para a linha 0 (o início do arquivo) todas as linhas que não possuem dois-pontos. (Em outras palavras, a lista dos primeiros campos é a saída de awk .)
O comando sort faz uma classificação s table, preservando a ordem das linhas além de organizá-las de acordo com o primeiro campo. (Nós já movemos os campos "header" para o início do arquivo.)
Em seguida, o comando s ubstitute transforma o prefixo de cada linha sem cabeçalho em uma guia.
Resultado da entrada fornecida:
Bug123
SomeComment
SecondComment
Bug222
SomeOtherComment
Explicações adicionais:
: (colon) é o que você digita em vi para iniciar um comando ex -style.
% é um intervalo de endereços em ex . Significa "aplicar a seguinte ação / comando a todas as linhas no buffer (arquivo)".
Quando usado com um endereço, ! inicia um "filtro" em ex : as linhas especificadas pelo endereço são alimentadas como entrada para o comando externo especificado e são substituídas no buffer pela saída desse comando .
-F: define o separador de campo Awk.
{} (chaves) são usados no Awk para envolver comandos a serem executados. Como não há nenhum endereço Awk precedendo as chaves (dentro das aspas simples), as ações nas chaves são aplicadas a cada linha de entrada.
a[$1] cria um elemento de matriz usando o primeiro campo da linha atual ( $1 ) como o índice. Como ele não diz = "whatever" , o elemento da matriz não tem valor , mas isso não importa; nós apenas queremos que o array contenha esse elemento.
; termina o comando Awk.
print é o comando Awk para imprimir a linha atual (por padrão) ou quaisquer argumentos que forem passados (como no último print i ).
END marca o bloco de ações (em chaves) para ser executado depois que toda entrada (para Awk) for processada.
O loop for imprime todos os índices da matriz chamada a . Quais são os primeiros campos desduplicados do arquivo de log, em nenhuma ordem específica.
Tanto para o comando Awk.
O comando v é um comando ex , que é o oposto do comando g lobal. g realiza uma ação em todas as linhas correspondentes a um determinado padrão. v executa a ação especificada em todas as linhas que NÃO correspondem ao padrão fornecido.
/ inicia e termina o padrão. Que é apenas : neste caso.
m significa "mover". Por isso, :v/:/m0 in vi move todas as linhas que não contêm dois pontos para o topo do arquivo.
O resto dos comandos deve ser bem claro. :)