Поиск уникальных записей в файле

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

Я использую Arch Linux/Debian Linux и хочу получить список уникальных “идентификаторов” в ASCII-текстовом файле. Вот фрагмент данных, который я хочу сократить:

... (Получено от VRW): wind ...
... (Получено от 1a00): air_ ...
... (Получено от 5710): air_ ...
... (Получено от ####): air_ ...
... (Получено от 15d8): air_ ...
... (Получено от ####): air_ ...
... (Получено от 6e9e): baro ...
... (Получено от 6e9e): volt ...
... (Получено от 6e9e): wind ...
... (Получено от 6e9e): air_ ...

Из-за большого размера файла и многочисленных дублирующихся “идентификаторов”, я хочу вывести только уникальные идентификаторы, чтобы вывод выглядел так:

... (Получено от VRW): wind ...
... (Получено от 1a00): air_ ...
... (Получено от 5710): air_ ...
... (Получено от ####): air_ ...
... (Получено от 15d8): air_ ...
... (Получено от 6e9e): baro ...

Ещё лучше было бы просто иметь список уникальных идентификаторов, таких как 15d8, 6e9e, VRW и так далее. Но я подозреваю, что это будет гораздо сложнее сделать.

Исходя из предложений по предыдущим похожим вопросам, я попробовал:

grep "(Получено от" datafile.txt

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

Я также попробовал:

grep "(Получено от" datafile.txt | sort -u

но не мог определить, есть ли какая-то разница

Я также попробовал:

parallel --tag --lb grep "Получено от" {} | perl -ne '$seen{$_}++ or print;' ::: Data1.txt

что, наверное, демонстрирует мой уровень незнания в этих вопросах.

Ещё лучше было бы просто иметь список уникальных идентификаторов, таких как 15d8, 6e9e, VRW и так далее. Но я подозреваю, что это будет гораздо сложнее сделать.

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

<datafile.txt sed -n 's/.*(Получено от \([^)]*\)): .*/\1/p' | sort -u

Заметки:

  • Если в строке есть два или более (Получено от …): , то будет извлечён только идентификатор из первого.
  • Идентификаторы, содержащие ), не поддерживаются.

На perl это можно сделать с помощью:

perl -ne 'print if /\(Получено от (.*?)\)/ && ! $seen{$1}++' datafile.txt

Где мы печатаем строки, если они совпадают с регулярным выражением, и то, что было сопоставлено с первой парой () внутри, ещё не было замечено.

С помощью awk (адаптировать $4 к правильной колонке):

awk -F' |)' '!seen[$4]++ {print $4}' file

или с помощью расширенной функции match() GNU-реализации awk и регулярного выражения:

gawk '{match($0, /Получено от ([^\)]+)/, a)} !seen[a[1]]++ {print a[1]}' file

С реализациями grep, поддерживающими -o и Perl-совместимые регулярные выражения, такими как GNU grep, собранными с поддержкой PCRE(2), и sort:

grep -oP 'Получено от \K[^)]+' file | sort -u

Этот вариант, в отличие от других, извлечёт все совпадения из строки.

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

Поиск уникальных записей в файле — это задача, встречающаяся в управлении данными, особенно когда речь идет о больших объемах информации, как это указано в вашем примере. Давайте подробно разберем, как можно осуществить поиск уникальных идентификаторов в текстовом файле с помощью различных инструментов, доступных в Unix-подобных системах, таких как Arch Linux или Debian.

Теория

Каждый раз, когда вы имеете дело с большими текстовыми файлами, в которых содержатся повторяющиеся записи, возникает необходимость эффективной фильтрации данных для выделения уникальных элементов. В вашем случае это уникальные идентификаторы, возникающие в строках формата "... (Received from XXXXX): ...". В целях оптимизации процесса и получения более чистого набора данных, важно использовать инструменты, которые могут быстро и эффективно обрабатывать большие текстовые файлы.

Основными шагами в этом процессе являются:

  1. Извлечение интересующей части строки, в данном случае, уникального идентификатора.
  2. Удаление дубликатов, сохраняя при этом только первые встреченные или все уникальные значения.
  3. Формирование результатов в удобочитаемой форме.

Пример

Использование sed

sed является мощным инструментом для обработки текстовых потоков, и в данном случае он может быть использован для извлечения идентификатора из каждой строки:

sed -n 's/.*(Received from \([^)]*\)): .*/\1/p' datafile.txt | sort -u

Здесь sed извлекает идентификатор из строки, а sort -u устраняет повторения, оставляя только уникальные записи.

Использование awk

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

awk -F' |)' '!seen[$4]++ {print $4}' datafile.txt

Это команда разбивает строку на токены и выводит только те, которые еще не встречались (благодаря использованию ассоциативного массива seen).

Использование grep с sort

Для тех, кто предпочитает использовать grep:

grep -oP 'Received from \K[^)]+' datafile.txt | sort -u

Этот метод полагается на использование -oP, чтобы извлечь только те части строки, которые соответствуют указанному регулярному выражению. Поскольку grep осуществляет только поиск, для удаления дубликатов здесь используется sort -u.

Применение

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

sed

sed прекрасно справляется с однопроходной обработкой строк. Это идеальный выбор, если вы предварительно не знаете, хотите ли вы заниматься дополнительной обработкой. Преимущество в том, что текстовые манипуляции выполняются за один проход, минимизируя использование памяти.

awk

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

grep + sort

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

Заключение

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

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

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