Eu gostaria de reorganizar o conteúdo de um arquivo por linha (veja abaixo), idealmente sem usar Perl ou Python (eu não tenho permissão para ... não pergunte).
O arquivo de entrada contém linhas de cabeçalho e linhas não ordenadas com resultados de operação de backup. Os arquivos de saída devem conter as linhas ordenadas conforme mostrado abaixo.
Arquivo original:
Completed Backups
Backups with Warnings
Failed Backups
Server A backup was completed with warnings
Server B backup was successful
Server C backup failed
Server D backup was completed with warnings
Resultado final:
Completed Backups
Server B backup was successful
Backups with Warnings
Server A backup was completed with warnings
Server D backup was completed with warnings
Failed Backups
Server C backup failed
linux
shell-script
VikJES
fonte
fonte
Respostas:
Abuso mal-intencionado de grep ahoy. Meu script original baseou-se no fato de que o grep faz distinção entre maiúsculas e minúsculas e que seu texto é estranhamente encapsulado, e esses casos são exclusivos. Eu fiz uma segunda variante (você pode ver a antiga na trilha de edição), que usa um pedaço maior das linhas que você precisa reorganizar. Fazê-lo 'corretamente' provavelmente acabaria sendo mais rápido, já que ele é executado em todo o seu arquivo de texto para cada comando grep - para um arquivo grande, isso significa que ele passa por 6 ciclos para reorganizá-lo.
Isso deve funcionar com alguns pequenos mods no windows ou linux, ou simplesmente copiar colado. Isso pressupõe que seu arquivo de origem é chamado original.txt e sua saída é new.txt. Você provavelmente pode classificar as linhas grep se precisar delas em ordem alfabética. >> acrescenta a uma nova linha
Eu provavelmente esperaria a resposta correta do sed ou do awk se eu fosse você. Eu também experimentaria subconjuntos maiores de suas strings
fonte
Infelizmente,
sed
ouawk
não vai ajudar muito aqui, porque a maneira mais fácil de reordenar as linhas é processar a entrada em várias passagens, como o Journeyman Geek mostrou.Aqui está apenas uma alternativa ligeiramente diferente, que abre o arquivo de saída apenas uma vez. Outra abordagem é também nos cabeçalhos, aqui eles são recriados em vez de transferi-los da origem.
Como alternativa para especificar a entrada e a saída no script, você pode lê-las a partir da linha de comando:
fonte
> "$output"
no final é executado apenas uma vez e é válido para o bloco inteiro{
... de}
modo que o arquivo de saída é aberto apenas uma vez. Outra alternativa poderia ser colocarexec > "$output"
para o começo. Em seu script, o arquivo de saída é aberto repetidamente com todos os redirecionamentos do stdout. --- Eu omiti as linhas de título intencionalmente: "eles são recriados em vez de transferidos da fonte"