Найдите строку и добавьте ее в конец файла.

У меня есть большой файл с записью, которая будет иметь разные значения, чем другие.

Фактический файл данных:

000000106500000000000129201300000U1E4600000060000+00000020400+00000002532+000000 0000001065000000000001182013000010144700002090000+00000335156+00000006776+000000 0000001065000000000003012014999999999924835390500+07164327872+00447479302+000000 0000001065000000000001102013000004QE8200000150000+00000056450+000000021 

$ grep -n "9999999999" BADINS0000001065_000000000020140301.dat

Я хотел добавить эту запись в нижнюю часть файла, просто если у меня есть ~ 100 записей в файле, если моя позиция записи находится где-то в файле, мне нужно найти, удалить из этого места (полностью) и добавить его в конец файла (Bottom of the file).

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

Не могли бы вы помочь мне в этом?

3 Solutions collect form web for “Найдите строку и добавьте ее в конец файла.”

С awk вы можете делать:

 awk ' /PATTERN/ { save = $0 ; next } { print } END { print save } ' infile > outfile 

где вам нужно заменить PATTERN на фактический шаблон, а infile – ваш файл данных; переименуйте их соответствующим образом.

Код работает следующим образом:

/PATTERN/ { save = $0 ; next } /PATTERN/ { save = $0 ; next } – если шаблон найден, сохраните эту строку для дальнейшего использования и пропустите печать (поэтому она удалена из этого места)

{ print } – печатает те строки в файле, которые не были пропущены предыдущей командой

END { print save } – наконец, когда все строки обработаны, добавьте сохраненную строку, ту, где соответствует шаблон

Если вы хотите перезаписать исходный файл новым файлом, добавьте команду mv после awk скрипта:

 mv outfile infile 

снова с правильно выбранными именами файлов.

Другое решение sed

 sed -i ' /9999999999/{h;d}; # move match string in hold space $G; # append string from hold space to end s/\n$// # avoid empty line if pattern have not met ' BADINS0000001065_0000000000* 

Вопрос неясно, присутствует ли всегда 9999999999 , или может быть более одного такого экземпляра во входном файле. Итак, вот версия sed которая подходит для всех этих ситуаций.
См. man sed (опция -i ) для обновления исходного файла на месте.

 sed -n '/9999999999/{H;bn}; p; :n; ${g;s/\n//p}' file 
  • Использовать sed для форматирования абзацев для латекса
  • grep с линиями продолжения
  • Замените конкретный символ, но не если он внутри ()
  • попытка добавить текст до и после некоторого текста
  • Извлечь адрес Mac из вывода
  • Дублирование каждой строки при изменении значения в каждой копии строки по-разному в Linux
  • Вытягивание IP-адреса из команды ping с помощью sed?
  • Удалите определенную команду латекса из текста и закрывающей скобки за ней
  • Правильно ли замените & & XML?
  • Переименуйте имена файлов MP3 в шаблон
  • Заменить 1-й с 1), 2-й с 2), ... в GNU Sed
  • Interesting Posts

    SSH-Keygen -i Fails: uudecode не удалось. Что может вызвать это?

    Использование редактора строк zsh для обтекания подпроцессов

    Как подождать, пока команда mv завершится в unix?

    Команда оболочки выполняется по-разному в терминале и скрипте

    Как выбрать, какой удаленный экземпляр vifm будет запускать команду?

    Добавление пользователя, который может выполнять только сценарии удаленно

    Проблема отправки электронной почты с помощью ssmtp

    umask не работает, как ожидалось, в другом, чем домашний каталог

    Шлем (ранее ничего), Идо и подобные инструменты для Emacs: Перекрытие и различия

    solaris 10..не виртуальные консоли?

    Самый быстрый способ конвертировать большое количество FLAC в MP3-файлы

    Запуск 64-разрядной Linux с 750 МБ ОЗУ: стоит?

    Синтаксис файла конфигурации LoggedFS

    Гость VirtualBox: обнаружено 16 процессоров, но только 1 онлайн

    Сравнение строк со специальными символами с использованием if-loop не работает

    Linux и Unix - лучшая ОС в мире.