Linux вывод уникальных строк

COREUTILS. Команда uniq. Вывод уникального содержимого

Общий синтаксис программы uniq в linux предельно простой:

unic [OPTIONS] [INPUT [OUTPUT]]

Тоесть, чтобы вывести уникальные строки, например в тестовом файле my_text_file, нужно команде uniq передать его имя в качестве аргумента

Нельзя, разумеется, забывать, что вы должны находится именно в той дирректории, где и лежит файл my_text_file. Иначе uniq необходимо передать полный путь до файла в linux:

Неуникальные строки можно посчитать. Для этого передайте quic в качестве опции ключ «-c».

unic -c /home/user/my_text_file

В выводе вы получите таблицу из 2-х колонок, в первой будет указано количество повторяющихся строк, во второй их значение.

В linux uniq также можно попросить печатать только те строки, которые имеют дубликаты, для этого нужно использовать ключ «-d»:

uniq -d /home/user/my_text_file

Опции можно комбинировать, и чтобы посчитать только строки которые имеют дубликаты, следует ввести такую команду:

uniq -d -с /home/user/my_text_file

В противовес ключу «-d» есть ключ «-u», заставляющий uniq выводить только строки, не имеющие дубликата:

uniq -u /home/user/my_text_file

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

не будут считаться уникальными. Чтобы разрешить эту проблему можно использовать в linux команду uniq совместно с командой sort, перенаправляя вывод одной команды на ввод другой:

sort -n my_text_file | uniq

или же просто использовать sort с ключом «-u»

sort -n -u my_text_file

Возможности и примеры использования утилиты sort мы уже освещали в статье COREUTILS. Команда sort. Сортировка вывода программ

Источник

Использование команды uniq в Linux (10 примеров)

Оригинал: Linux Uniq Command Tutorial for Beginners (10 examples)
Автор: Himanshu Arora
Дата публикации: 23 мая 2017 г.
Перевод: А.Панин
Дата перевода: 24 мая 2017 г.

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

В данной статье мы будем обсуждать методику использования утилиты uniq на основе простых для понимания примеров. Но перед тем, как приступить к рассмотрению примеров стоит упомянуть о том, что все примеры и инструкции из данной статьи были протестированы в системе Ubuntu 16.04 LTS.

Утилита uniq в Linux

Как уже говорилось ранее, утилита uniq осуществляет вывод или удаление из вывода повторяющихся строк. А это синтаксис соответствующей команды:

А это описание функций утилиты с ее страницы руководства: «Утилита осуществляет фильтрацию идентичных строк из ВХОДНОГО ФАЙЛА (или из стандартного потока ввода) и выводит информацию в ВЫХОДНОЙ ФАЙЛ (или стандартный поток вывода). При вызове без параметров идентичные строки объединяются в рамках первых найденных экземпляров строк.»

Ниже приведен ряд примеров, которые помогут вам лучше понять принцип работы рассматриваемой утилиты.

1. Удаление повторяющихся строк из вывода

Предположим, что в нашем распоряжении имеется файл со следующими строками:

Несложно заметить, что каждая из строк повторяется. Теперь применим утилиту uniq по отношению к этому файлу и посмотрим, к чему это приведет.

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

2. Вывод информации о количестве дубликатов каждой из строк

Если вам нужно, вы можете использовать утилиту uniq для вывода информации о количестве повторений каждой из строк файла. Это может быть сделано с помощью параметра командной строки -c . Например, команда

будет генерировать следующий вывод:

Несложно заметить, что перед каждой из строк выводится число, соответствующее количеству ее повторений.

3. Вывод лишь повторяющихся строк

Для того, чтобы утилита uniq выводила лишь повторяющиеся строки, следует использовать параметр -D командной строки. Например, предположим, что файл с именем файл file1 теперь содержит дополнительную строку в конце (обратите внимание на то, что эта строка не повторяется).

Теперь при исполнении команды

будет генерироваться следующий вывод:

Как вы видите, параметр -D сообщает утилите uniq о необходимости вывода всех повторяющихся строк, включая их повторы. Для лучшей читаемости вы можете активировать режим вывода пустой строки после каждой из групп повторяющихся строк с помощью параметра —all-repeated .

Данный параметр требует от пользователя обязательного указания метода добавления разделителя. Строки могут добавляться к разделителю (то есть, пустой строке) с помощью метода prepend или разделяться с помощью него с помощью метода append . Например, в данном случае используется метод prepend .

Читайте также:  Check windows version from command line

Более того, если вам нужно, чтобы утилита выводила лишь по одному экземпляру каждой из повторяющихся строк, вы можете воспользоваться параметром -d . Это пример его использования:

Очевидно, что в выводе приводится лишь по одному экземпляру строки из каждой группы.

4. Пропуск начальных фрагментов строк

Иногда, в зависимости от ситуации, совпадение двух строк может быть установлено по совпадению определенных частей этих строк. Например, рассмотрим следующий файл:

Теперь предположим, что строки должны считаться совпадающими или не совпадающими на основании совпадения или несовпадения их вторых полей (то есть HTF или FF) и вам нужно сделать так, чтобы утилита uniq использовала такой же критерий сравнения, чего несложно добиться с помощью параметра командной строки -f .

Параметр -f требует от вас обязательной передачи числа, которое соответствует количеству полей, которые нужно пропустить. Например, в нашем случае мы передаем в качестве значения параметр -f значение 1, так как мы хотим, чтобы утилита uniq пропустила лишь первое поле:

Из вывода очевидно, что утилита uniq посчитала первую и третью строку повторяющимися исключительно на основе их вторых полей.

5. Вывод всех строк с разделением групп повторяющихся строк

При необходимости вывода всех строк с разделением групп повторяющихся строк с помощью пустой строки вы можете использовать параметр —group . Как и в случае описанного выше параметра —all-repeated , параметр —groups требует от пользователя обязательного указания позиции пустой строки ( prepend , append или both ).

Это пример использования рассматриваемого параметра:

Обратите внимание на параметр -f , который обсуждался в предыдущем разделе.

6. Вывод лишь не повторяющихся строк

Вы уже наверняка поняли, что утилита uniq по умолчанию выводит лишь повторяющиеся строки. Но если вам нужно, вы можете сообщить ей о необходимости вывода лишь не повторяющихся или уникальных строк. Это делается с помощью параметра командной строки -u .

В нашем случае команда будет выглядеть следующим образом:

Это пример ее использования:

Обратите внимание на параметр -f , который обсуждался в разделе 4.

7. Пропуск заданного количества символов в начале строк

В одном из предыдущих разделов мы обсуждали методику пропуска полей строк при использовании утилиты uniq. Однако, при необходимости вы можете сообщить утилите о необходимости пропуска не начальных полей, а начальных символов строк. Для доступа к соответствующей функции может использоваться параметр командной строки -s .

Например, предположим, что наш файл содержит следующие строки:

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

А это приведенная выше команда в действии:

Несложно заметить, что четвертая строка (faq_forge) из оригинального файла была пропущена. Это объясняется тем, что после пропуска первых четырех символов третья и четвертая строки становятся идентичными для утилиты uniq и она выводит лишь первую из них.

8. Указание количества символов для сравнения

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

Например, предположим, что файл содержит следующие строки:

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

Это приведенная выше команда в действии:

Так как первые три символа третьей и четвертой строк совпадают, эти строки считаются утилитой идентичными. По этой причине в выводе находится лишь третья строка.

9. Сравнение строк без учета регистра

По умолчанию утилита uniq осуществляет сравнение строк с учетом регистра символов. Однако, вы можете активировать режим сравнения строк без учета регистра символов с помощью параметра командной строки -i .

Например, предположим, что мы будем использовать файл с содержимым, аналогичным рассмотренному в предыдущем разделе, но теперь четвертая строка будет начинаться с символов H, O и W в верхнем регистре.

Теперь, если вы попытаетесь выполнить рассмотренную в предыдущем разделе команду, вы получите отличный вывод:

Это объясняется тем, что первые три символа третьей и четвертой строк отличны для утилиты uniq ввиду их регистра. В подобных ситуациях вы можете активировать режим сравнения строк без учета регистра с помощью параметра командной строки -i .

10. Использование завершающего нулевого символа вместо символа перехода на новую строку

По умолчанию утилита uniq генерирует вывод с завершающим символом перехода на новую строку. Однако, при необходимости вы можете активировать режим использования завершающего нулевого символа (полезный при вызове uniq из сценариев). Для этого следует использовать параметр командной строки -z :

Заключение

Мы рассмотрели практически все поддерживаемые утилитой uniq параметры командной строки, поэтому вам остается лишь самостоятельно испытать их в работе для того, чтобы лучше понять их принцип работы и функции. И как обычно, в случае каких-либо сомнений и вопросов следует обращаться к странице руководства утилиты .

Источник

10 утилит командной строки для анализа данных в Linux

Оригинал: 10 command-line tools for data analysis in Linux
Автор: Jason Baker
Дата публикации: 23 февраля 2017 года
Перевод: А. Кривошей
Дата перевода: август 2017 г.

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

Читайте также:  List disks windows command line

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

Строго говоря, большинство этих инструментов не относится именно к Linux. Большинство из них восходит к временам становления Unix, поэтому пользователи других Unix-систем также уже скорее всего обладают ними, или легко могут их установить. Многие из этих утилит являются частью пакета GNU Coreutils, некоторые поддерживаются обособленно, и приложив определенные усилия, вы сможете пользоваться ими даже в Windows.

Так что давайте попробуем несколько простых утилит для анализа данных с открытым исходным кодом, и посмотрим, как они работают. Если вы захотите повторить то, что мы будем делать в примерах, скачайте этот файл с данными в формате CSV (comma separated value) с GitHub. Он представляет собой список статей, опубликованных на Opensource.com в январе.

head и tail

Для начала давайте посмотрим на наш файл. Что он собой представляет? на что похож формат данных? Вы можете вывести содержимое файла в терминал с помощью команды cat, но если ваш файл содержит достаточно большое количество строк, это вам вряд ли поможет.
Используйте head и tail. Обе эти утилиты показывают заданное количество строк в начале и в конце файла. Если вы не зададите количество выводимых строк, по умолчанию оно равно 10. Давайте посмотрим на наш файл.

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

Отлично, теперь все стало на свои места. У нас имеется список статей с датой их публикации, типом контента для каждой, именем автора, заголовком, количеством комментариев, относительным URL, тегами для каждой статьи и количеством слов.

Все это прекрасно, но каков размер файла? Говорим мы об анализе нескольких десятков статей, сотен, или может быть тысяч? Здесь нам может помочь команда wc — сокращение «word count», которая может посчитать количество байтов, символов, слов или строк в файле. В нашем случае мы хотим знать количество строк.

Итак, в нашем файле 93 строки. Так как мы знаем, что первая строка — это заголовки, мы можем сказать, что это список из 92 статей.

Хорошо, теперь давайте спросим себя: сколько из этих 92 статей посвящены безопасности? Для наших целей давайте считать, что нас интересует слово «security» в заголовках, тегах и в любом другом месте. В поиске нам поможет утилита grep. Она может искать заданный паттерн из символов. grep — очень мощная утилита, с помощью регулярных выражений вы можете построить самые разные паттерны. Но сейчас нам нужно найти очень простую строку.

После команды grep следует флаг «-i», который говорит о том, что регистр букв при поиске не учитывается, затем следует паттерн, который мы ищем, и затем файл, в котором производится поиск. Похоже, что за последний месяц у нас было четыре статьи, посвященные безопасности. Но давайте представим, что у нас огромный список статей по безопасности, и подсчитать их не так то просто. Комбинируя команды grep и wc с помощью канала, мы получим количество статей по безопасности.

В этом случае вывод команды grep перенаправляется на ввод команды wc, и нам нет необходимости сохранять промежуточные результаты.

CSV — это очень полезный формат файла для многих сценариев анализа данных, но что, если вам нужно конвертировать файл в другой формат для использования в стороннем приложении? Возможно вам понадобятся разделители tab вместо запятых, или вы захотите заменить их на HTML, чтобы выводить данные в табличном формате. Как и в других примерах, вы можете использовать каналы для перенаправления ввода и вывода этой команды.

Давайте попробуем другой файл, создав файл формата TSV (значения, разделенные табуляцией) только со статьями, которые были опубликованы 20 января.

Что здесь происходит? Сначала мы искали нужную нам дату с помощью grep. Вывод мы перенаправили в команду tr, используемую для замены запятых на табуляцию (задается ключем ‘\t’). Символ > перенаправляет вывод в новый файл вместо экрана. Вся эта последовательность действий задается одной строкой команд. Затем мы можем проверить, содержит ли файл jan20only.tsv ожидаемые данные.

Что, если мы захотим узнать больше деталей об одном из столбцов? Какая из статей в нашем новом списке самая большая? Давайте поработаем над нашим последним примером. Теперь, когда у нас есть список статей только от 20 января, мы можем отсортировать их по столбцу количества слов с помощью команды sort. Конечно, здесь нам тоже не понадобится промежуточный файл, вместо этого мы можем перенаправить вывод последней команды. Но на практике иногда проще разбивать сложные задачи на более простые части, чем строить длинные и запутанные цепочки команд.

Читайте также:  Можно ли мне обновить windows

Это еще один сложный пример, давайте разберемся, что здесь происходит. Сначала мы используем команду sort для сортировки статей по количеству строк. Опция -nr указывает на числовую сортировку и вывод результатов в обратном порядке (от наибольшего значения к наименьшему). Следующая опция -t$’\t’ говорит команде sort о том, что разделителем является tab (‘\t’). Секция -k8 команды указывает, что нужно использовать восьмой столбец, в котором в нашем примере хранится количество слов.
Наконец вывод передается с инструкцией показать только верхнюю строчку, которая в нашем случае представляет строку с наибольшим количеством слов.

Вам может понадобиться выбрать из файла заданные строки. Это можно сделать с помощью команды sed (сокращение от stream editor). Что, если вы хотите объединить несколько файлов, все с заголовками? Вам нужен только один набор заголовков, поэтому остальные необходимо будет очистить. Или вам нужен только определенный диапазон строк. Здесь нам также поможет sed. С его помощью также удобно производить пакетный поиск и замену.

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

Опция ‘1 d’ означает удаление первой строки. sed — очень мощная утилита, и я рекомендую изучить его возможности по поиску и замене элементов.

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

В этом примере мы с помощью опции -d’,’ сообщаем cut, что разделителями в файле являются запятые, нам нужен третий столбец (-f3), а вывод мы перенаправляем в новый файл authors.txt.

Выполнив последний пример, мы получили список авторов, но сколько в этом списке уникальных авторов? Сколько статей написал каждый автор? На эти опросы вы сможете ответить с помощью команды uniq. Давайте отсортируем файл, найдем уникальные значения и направим вывод в файл, содержащий количества статей, написанных каждым автором.

Теперь мы можем увидеть количество статей, написанное каждым автором. Давайте просмотрим только три последние строки:

Давайте рассмотрим еще один инструмент командной строки в нашем наборе для анализа данных — awk. Это один из тех случаев, когда я не слишком много смогу рассказать о его возможностях, поскольку мощь awk просто огромная, и он заслуживает отдельного рассмотрения. Это еще один отличный инструмент для замены, который может много чего сверх этого. Вернемся к нашему TSV-файлу, в котором мы ранее собрали статьи от 20 января, и используем его для создания нового списка, в котором будуь только авторы этих статей, а также количества слов, написанных каждым автором.

Что здесь происходит? С помощью опции -F «\t» мы указываем awk, что работаем с данными, разделенными табуляцией. В фигурных скобках задается выполнение небольшого кусочка кода. Печатается третий столбец ($3), а затем последний столбец с $NF (количество полей — «number of fields») с двумя пробелами между ними для улучшения читаемости.

Что дальше? Разве мы не можем сделать все это еще быстрее в электронной таблице, или просто просмотреть содержимое файла в некоторых случаях? Конечно можем! А теперь представьте, что ваш файл содержит не 93, а 93000 строк, или даже больше. Сможет ваша электронная таблица загрузить его без зависаний или значительного замедления работы? Или представьте, что вместо одного файла с данными по статьям за один месяц, у вас отдельный файл по каждому месяцу за последние семь лет. В таких случаях внезапно электронные таблицы перестают быть лучшими инструментами для обработки данных, но вы все еще не достигли уровня, где требуются инструменты для работы с big data.

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

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

Примечание: Приведенные выше описания команд очень краткие. Между тем на нашем сайте вы легко найдете более полное описание любой из перечисленных выше команд, просто задав в поле «Поиск по сайту» (это поле находится в верхней части любой страницы, сразу под логотипом) название команды, например: «grep» (замените имя команды на нужное).

Источник

Оцените статью