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

обзор

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

  • Как продолжить предложение с помощью команды внутри
  • Как увеличить день в день, который хранится в переменной
  • Как обрабатывать совпадения строк awk?
  • Двойные кавычки: синтаксическая ошибка рядом с `токеном 'не ожидается' ('
  • Значение «+» или «-» в сообщениях nohup
  • Как я могу отредактировать мой скрипт bash для учета пробелов?
  • 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?

  • Использовать autocd и CDPATH вместе в bash?
  • Меньше знака после выполнения в сценарии оболочки
  • Как настроить выбор awk на содержимое поля 1?
  • разные результаты от awk и grep
  • Не получайте вывод для сценария оболочки, используя if и for
  • При запуске программы запускаются программы .bashrc?
  • 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

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