Как удалить все неупорядоченные строки из текстового файла?

обзор

Рассмотрим упорядоченный список, чередующийся с неупорядоченными элементами, например:

Alligator Ant Falcon <-- Baboon Badger Armadillo <-- Caiman Cat 

Как этот список можно обработать так, чтобы все неупорядоченные элементы были удалены? Например:

 Alligator Ant Baboon Badger Caiman Cat 

Дополнительная информация

Неупорядоченные элементы всегда сингулярны, упорядоченные элементы входят в группы по меньшей мере из двух строк. Общая картина:

 ordered ordered ordered unordered <-- ordered ordered unordered <-- ordered ordered 

Неупорядоченные элементы могут быть как ниже …

 A B F <--- D E 

… и выше, чем следующий упорядоченный элемент:

 A C B <--- D E 

Сделать дело еще сложнее: элементы могут быть как верхними, так и нижними и содержать диакритические знаки (например: ä, ö, à).


Есть ли способ сделать это с помощью bash?

2 Solutions collect form web for “Как удалить все неупорядоченные строки из текстового файла?”

Это работает, если последняя строка в порядке:

 awk 'BEGIN {IGNORECASE=1}; NR==1 {lastline=$0; next;}; {if($0>lastline) {print lastline; '\ 'lastline2=lastline; lastline=$0;} else if ($0>lastline2) lastline=$0; }; '\ 'END {print lastline;}' file1.txt 

старая версия (с ошибками, для сравнения)

 awk 'BEGIN {IGNORECASE=1}; NR==1 {lastline=$0; next;}; '\ '{if($0>lastline) print lastline; lastline=$0;}; END {print lastline;}' file 

Раствор оболочки:

 #!/bin/bash IFS= before= read -r current while read -r after do [[ "$before" < "$current" || "$before" = "$current" ]] && [[ "$current" < "$after" || "$current" = "$after" ]] && printf '%s\n' "$current" && before="$current" current="$after" done [[ "$before" < "$current" || "$before" = "$current" ]] && printf '%s\n' "$current" тем #!/bin/bash IFS= before= read -r current while read -r after do [[ "$before" < "$current" || "$before" = "$current" ]] && [[ "$current" < "$after" || "$current" = "$after" ]] && printf '%s\n' "$current" && before="$current" current="$after" done [[ "$before" < "$current" || "$before" = "$current" ]] && printf '%s\n' "$current" того, как #!/bin/bash IFS= before= read -r current while read -r after do [[ "$before" < "$current" || "$before" = "$current" ]] && [[ "$current" < "$after" || "$current" = "$after" ]] && printf '%s\n' "$current" && before="$current" current="$after" done [[ "$before" < "$current" || "$before" = "$current" ]] && printf '%s\n' "$current" 

Использование: ./script <input_file

Обратите внимание, что с помощью bash вы можете использовать [[..]] сравнения для лексических сравнений, чтобы быть зависимыми от языка и менее наивными (должны работать с ä, ö, à и т. Д.).

Что касается вопроса Стефана о том, как решить последний пример в вопросе, это отдает предпочтение более позднему появлению. Таким образом, он фактически удалит C

  • BSD sed: заменить только N-е вхождение шаблона
  • Извлечь третью группу текста из разделителей диапазонов
  • Сравните 2 файла, если он находится между диапазоном чисел
  • удалить содержимое с начала на первую пустую строку
  • Наложение символа между повторяющимися символами
  • Извлечь абзац, разделенный на *** с помощью AWK
  • Объединение двух частей вместе для создания единого сценария
  • Добавление строки в файл из удаленного ssh
  • Как заполнить конечные теги с помощью sed, awk или любой другой команды?
  • Замените все вхождения символа в переменной с помощью скрипта korn
  • Создание файлов из шаблонов, замещение в середине других слов
  • Interesting Posts

    Как я могу преследовать программу, которая поднимает температуру моего ноутбука?

    Мышь и клавиатура перестают работать во время установки в режиме debian live

    Как SANE обнаруживает сканер, который был отключен?

    Добавить столбец в интерфейс диспетчера архива

    Лучший сенсорный монитор для Linux под $ 500

    Стабильное время для сценариев оболочки?

    установить правила для openvpn с помощью iptables в брандмауэре CentOS 6.2

    Извлечь последнюю строку многострочной строки

    Могу ли я установить тайм-аут открытия Kwallet?

    Как определить, что моя система автоматически перезагрузилась после паники ядра?

    Система альтернатив Debian: программы с одинаковыми именами и приоритетами

    Ограничение количества одновременных подключений по всей системе?

    Как изменить значок Firefox на панели и меню?

    Как проверить, когда истекут метаданные yum?

    Синхронизировать IMAP с папками maildir – быстрое и полное решение с поддержкой IDLE?

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