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

обзор

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

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?

  • Разбор строк файла данных с помощью разделителя Вместо EOL
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Удалите обе строки, если значения столбца A повторяются в следующей строке
  • найти и заменить строку в файле без использования временного файла с SED
  • Группировать по и сумме в сценарии оболочки без awk
  • Регулярные команды и команды с командой sed
  • Отменить перемещение букв с помощью sed
  • Преобразование таблицы csv в HTML
  • 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 - лучшая ОС в мире.