Reorganizar conteúdo de um arquivo

0

Eu gostaria de reorganizar o conteúdo de um arquivo por linha (veja abaixo), de preferência sem usar Perl ou Python (não posso ... 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
    
por VikJES 17.10.2013 / 14:39

2 respostas

1

Abuso mal-intencionado do 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 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 poderia classificar as linhas grep-out se precisar delas em ordem alfabética. > > acrescenta a uma nova linha

 #! /bin/sh

    grep "Completed Backups" original.txt >> new.txt
    grep "backup was successful" original.txt >> new.txt
    grep "Backups with Warnings" original.txt >> new.txt
    grep "backup was completed with warnings" original.txt >> new.txt
    grep "Failed Backups"  original.txt >> new.txt
    grep "backup failed" original.txt >> new.txt

Eu provavelmente esperaria pela resposta correta do sed ou do awk se eu fosse você. Eu também experimentaria subconjuntos maiores de suas strings

    
por 17.10.2013 / 14:59
1

Infelizmente, sed ou awk não ajudará muito 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. Também outra abordagem está nos cabeçalhos, aqui eles são recriados em vez de transferi-los da origem.

#!/bin/sh

output=new.txt
input=original.txt

{
  echo "Completed Backups"
  grep "Server .* backup was successful" < "$input"

  echo "Backups with Warnings"
  grep "Server .* backup was completed with warnings" < "$input"

  echo "Failed Backups"
  grep "Server .* backup failed" < "$input"
} > "$output"

Como uma alternativa para especificar a entrada e a saída no script, você pode lê-las a partir da linha de comando:

output="$1"
input="$2"
    
por 18.10.2013 / 09:39