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

обзор

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

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?

  • sed + удалить слово из определенной строки
  • Лучше, чем `tee | разрезать | ... | paste`
  • Сценарий для извлечения выбранных записей из файла bibtex
  • Удалить до первого вхождения, отредактировать эту строку и распечатать оставшиеся строки без изменений
  • Как изменить все строки в файле python от snake_case до camelCase в sed
  • Как вставить содержимое файла в другой файл перед шаблоном (маркером)?
  • Как найти и заменить новую строку?
  • sed или tr однострочный, чтобы удалить все числовые цифры
  • 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 - лучшая ОС в мире.