сортировка –проверка: продолжить после первого беспорядка

Вопрос или проблема

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

Я могу проверить, отсортирован ли файл, с помощью команды sort:

sort -cns -k1.14,1.15 -k1.1,1.10 file.txt

Но это только сообщает мне о первом сбое в сортировке (sort: file.txt:42: disorder: <плохая строка>.)

Могу ли я заставить его продолжить и сообщить мне о дальнейших сбоях в файле?

Ни одно из реализаций sort, которые я проверял (GNU, busybox, toybox, ast-open), не имеет опции для сообщения обо всех сбоях, вам нужно будет сделать это вручную, переведя спецификацию ключа сортировки на язык по вашему выбору.

В вашем примере это относительно просто на perl:

perl -Mopen=locale -lne '
  @key = (substr($_, 13, 2), substr($_, 0, 10));
  if ($. > 1 && ($key[0] <=> $pkey[0] || $key[1] <=> $pkey[1]) < 0) {
    print STDERR "Нарушение порядка на строке $.";
  }
  @pkey = @key' yourfile

.

Ответ или решение

Вопрос о том, как найти все места в большом файле, где ключи убывают по сравнению с предыдущей строкой, является актуальным для специалистов в области информационных технологий, особенно в контексте обработки данных. В данном ответе мы разберем, как использовать команду sort для проверки сортировки файла и предложим альтернативный подход для получения полной информации о несоответствиях.

Использование команды sort

Команда sort в UNIX-подобных системах предоставляет возможность проверять, отсортирован ли файл, с помощью опции -c. В вашем примере команда:

sort -cns -k1.14,1.15 -k1.1,1.10 file.txt

проверяет файл file.txt на предмет сортировки по заданным ключам. Однако, как вы правильно отметили, данная команда останавливается при первом обнаружении несоответствия и возвращает сообщение вида:

sort: file.txt:42: disorder: <bad line>

Ограничения sort

К сожалению, стандартные реализации команды sort, такие как GNU, BusyBox и другие, не поддерживают возможность выхода за пределы первого найденного несоответствия и, следовательно, не могут предоставить полное представление о всех рандомных местах в файле. Это требует дополнительного подхода для анализа данных.

Альтернативное решение с помощью Perl

Вы можете использовать скрипт на Perl для более детального анализа. Приведенный ниже код позволяет определить все строки, которые идут в порядке убывания по сравнению с предыдущими:

perl -Mopen=locale -lne '
  @key = (substr($_, 13, 2), substr($_, 0, 10));
  if ($. > 1 && ($key[0] cmp $pkey[0] < 0 || $key[1] cmp $pkey[1] < 0)) {
    print STDERR "Disorder at line $.";
  }
  @pkey = @key' yourfile

Объяснение кода

  1. Чтение файла: Каждая строка файла считывается поочередно.
  2. Формирование ключа: Для каждой строки создается массив @key, который включает подстроки, извлекаемые из строки (substr).
  3. Сравнение с предыдущим ключом: Сравниваются текущий и предыдущий ключи с использованием оператора cmp, который позволяет осуществлять лексикографическое сравнение строк.
  4. Уведомление о несоответствиях: Если текущий ключ меньше предыдущего, информация о несоответствии выводится в стандартный поток ошибок.

Заключение

Использование команды sort эффективно для простой проверки сортировки, но в случае необходимости анализа всех неупорядоченных элементов в большом файле стоит использовать программы вроде Perl. Данный подход не только позволяет выявить все места с нарушением порядка, но и дает гибкость в обработке данных различного формата.

Данный метод обработки файла может быть полезным в области обработки больших данных, а также в таких сферах, как анализ логов, где поддержка целостности данных имеет важное значение.

Оцените материал
Добавить комментарий

Капча загружается...