Я хотел бы изменить содержание файла для каждой строки (см. Ниже), в идеале без использования Perl или Python (мне не разрешено ... Не спрашивай.)

Входной файл содержит неупорядоченные строки заголовка и строки с результатами операции резервного копирования. Выходные файлы должны содержать строки, упорядоченные, как показано ниже.

Исходный файл:

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

Конечный результат:

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

2 ответа2

1

К сожалению, sed или awk здесь не сильно помогут, потому что самый простой способ переупорядочения строк - это обработка ввода в несколько проходов, как показал Journeyman Geek.

Вот только немного другая альтернатива, которая открывает выходной файл только один раз. Также другой подход заключается в заголовках, здесь они воссоздаются, а не переносятся из источника.

#!/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"

В качестве альтернативы указанию ввода и вывода в сценарии вы можете прочитать их из командной строки:

output="$1"
input="$2"
1

Вредоносные оскорбления греха Мой оригинальный сценарий основывался на том факте, что grep чувствителен к регистру, и что ваш текст странным образом написан, и эти случаи уникальны. Я сделал второй вариант (вы можете увидеть старый в журнале редактирования), который использует больший кусок строк, которые вам нужно переставить. Выполнение «правильно», скорее всего, будет быстрее, так как он проходит через весь текстовый файл для каждой команды grep - для большого файла это означает 6 циклов его реорганизации.

Это должно работать с некоторыми незначительными модами на Windows или Linux, или просто вставить копию. Это предполагает, что ваш исходный файл называется original.txt, а ваш вывод - new.txt. Вы могли бы отсортировать выделенные строки, если они вам нужны по алфавиту. >> добавляет к новой строке

 #! /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

Я бы, вероятно, дождался правильного ответа на основе sed или awk на вашем месте. Я также экспериментировал с большими подмножествами ваших строк

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .