Kodomo

Пользователь

Программа uniq

Синтаксис

uniq [название файла-источника] [название файла, в который сохраняется результат]

Оба аргумента вроде как не обязательные, но об этом дальше

Общее описание

Считает количество повторяющихся строк в файле или убирает эти повторы. Берёт эти самые строки из указанного файла и сравнивает соседние строки. В общем случае, если не указаны какие-то опции, выводит уникальные строки: если последующая строка совпадает с предыдущей, она опускается.

Например, если скормить этой программе такой текстовый файл solenodontidae.txt:

Щелезубы - Solenodontidae -

Семейство млекопитающих, в нём всего два вида:

Кубинский щелезуб и Гаитянский щелезуб

Кубинский щелезуб и Гаитянский щелезуб

Кубинский щелезуб и Гаитянский щелезуб

Примерно таким образом:

...$ uniq solenodontidae.txt

То на стандартный вывод будет подано что-то такое:

Щелезубы - Solenodontidae -

Семейство млекопитающих, в нём всего два вида:

Кубинский щелезуб и Гаитянский щелезуб

Если не указывать второй аргумент, строки выводятся через стандартный вывод (stdout). Если то, что получилось, нужно сохранить в файл, в конце просто добавляется > [имя_нового_файла]. Однако если такой файл уже существует, при этом он перезапишется. Если это не то, чего мы хотим, лучше использовать >> [имя_файла], при этом информация допишется в конец файла.

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

Опции

Считает количество повторов данной строки (с - от count):

1 Щелезубы - Solenodontidae -

1 Семейство млекопитающих, в нём всего два вида:

3 Кубинский щелезуб и Гаитянский щелезуб

-i

Игнорирует регистр при сравнении строк (i - ignore_case). В таком случае по идее "вот такая" и "ВоТ тАКаЯ" строки не будут различаться, но опытным путём получается, что это работает только с латиницей. Пусть файл solenodontidae1.txt выглядит так:

Щелезубы - Solenodontidae -

Семейство млекопитающих, в нём всего два вида:

Кубинский ЩЕЛЕЗУБ и Гаитянский щелезуб

Кубинский щелезуб и ГАИТЯНСКИЙ щелезуб

Кубинский щелезуб и Гаитянский ЩеЛеЗуБ

solenodontidae

SOLENODONTIDAE

Тогда результатом выполнения команды uniq -i solenodontidae1.txt будет

Щелезубы - Solenodontidae -

Семейство млекопитающих, в нём всего два вида:

Кубинский ЩЕЛЕЗУБ и Гаитянский щелезуб

Кубинский щелезуб и ГАИТЯНСКИЙ щелезуб

Кубинский щелезуб и Гаитянский ЩеЛеЗуБ

solenodontidae

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

-[какое-то число] или -f [какое-то число]

Пропускает указанное количество "слов" ("полей" - отсюда f, потому что fields) и только потом начинает сверять строки. В данном случае "слова" - это последовательности символов, разделённые между собой хотя бы одним пробелом или знаком табуляции, но не содержат внутри себя таких разграничивающих символов. При этом количество пробелов перед пропускаемыми словами не важно, но принципиально перед остальными

Ввод

Команда

Вывод

Тучка картошечка

uniq -f1 1.txt

Тучка картошечка

Легущка картошечка

hello hijklmnop

hello hijklmnop

bye hijklmnop

+[какое-то число] или -s [какое-то число]

Пропускает указанное число символов (s здесь от skip_chars) и только потом начинает сверять строки (снова почему-то, видимо, работает только с латиницей)

Ввод

Команда

Вывод

Ягодка монетка

uniq -s 10 1.txt

Ягодка монетка

Белая таблетка

Белая таблетка

abcdefg hijklmnop

abcdefg hijklmnop

qrs tuv hijklmnop

Если применены эти две пропускающие опции, то сначала пропускаются "слова", а потом символы

Users/cringebutfree/pr3 (последним исправлял пользователь cringebutfree 2022-11-19 12:43:40)