Вопрос или проблема
Я хотел бы получить список всех мест в большом файле, где ключи уменьшаются по сравнению с предыдущей строкой.
Я могу проверить, отсортирован ли файл, с помощью команды 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
Объяснение кода
- Чтение файла: Каждая строка файла считывается поочередно.
- Формирование ключа: Для каждой строки создается массив
@key
, который включает подстроки, извлекаемые из строки (substr
). - Сравнение с предыдущим ключом: Сравниваются текущий и предыдущий ключи с использованием оператора
cmp
, который позволяет осуществлять лексикографическое сравнение строк. - Уведомление о несоответствиях: Если текущий ключ меньше предыдущего, информация о несоответствии выводится в стандартный поток ошибок.
Заключение
Использование команды sort
эффективно для простой проверки сортировки, но в случае необходимости анализа всех неупорядоченных элементов в большом файле стоит использовать программы вроде Perl. Данный подход не только позволяет выявить все места с нарушением порядка, но и дает гибкость в обработке данных различного формата.
Данный метод обработки файла может быть полезным в области обработки больших данных, а также в таких сферах, как анализ логов, где поддержка целостности данных имеет важное значение.