JavaRush /Курсы /Docker SELF /Сортировка и фильтрация файлов: команды `sort`, `uniq`, `...

Сортировка и фильтрация файлов: команды `sort`, `uniq`, `cut`

Docker SELF
8 уровень , 3 лекция
Открыта

1. Команда sort

Команда sort предназначена для сортировки строк в текстовом файле. Она работает с любым форматом текста: от обычного плоского текста до CSV. По умолчанию она сортирует строки в алфавитном порядке. Однако, есть куча опций, которые позволят вам творить настоящие чудеса.

Основной синтаксис

sort [опции] файл

Простой пример

Допустим, у нас есть файл names.txt с таким содержимым:

Charlie
Alice
Bob
David

Мы можем отсортировать его по алфавиту так:

sort names.txt

Результат:

Alice
Bob
Charlie
David

Ключевые опции sort

Сортировка в обратном порядке

Если вы хотите отсортировать строки в убывающем порядке, используйте опцию -r:

sort -r names.txt

Результат:

David
Charlie
Bob
Alice

Числовая сортировка

Для чисел алфавитная сортировка может работать некорректно. Например, вот содержимое файла numbers.txt:

10
2
5
1

Алфавитная сортировка выдаст:

1
10
2
5

Но с опцией -n (числовая сортировка):

sort -n numbers.txt

Результат будет корректным:

1
2
5
10

Устойчивость к пробелам

Иногда строки содержат пробелы в начале или конце. Чтобы sort не путался, используйте опцию -b:

sort -b грязный_файл.txt

Пример

Предположим, у нас есть журнал посещений веб-сайта visits.log:

user2 15
user1 5
user3 30
user4 20

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

sort -k2 -n visits.log

Где -k2 означает "использовать второй столбец для сортировки". Результат:

user1 5
user2 15
user4 20
user3 30

2. Команда uniq

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

Основной синтаксис

uniq [опции] файл

Простой пример

Допустим, у нас есть файл colors.txt:

red
green
green
blue
blue
blue
red

Если мы просто используем uniq:

uniq colors.txt

Результат будет:

red
green
blue
red

Удаление неизбежных дубликатов

Сначала отсортируем файл:

sort colors.txt | uniq

Результат:

blue
green
red

Ключевые опции uniq

Подсчёт повторений

Если вы хотите узнать, сколько раз каждая строка встречалась, используйте опцию -c:

sort colors.txt | uniq -c

Результат:

   3 blue
   2 green
   2 red

Пример

В файле access.log у нас есть список IP-адресов:

192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1

Мы хотим узнать, какой IP встречался чаще всего:

sort access.log | uniq -c | sort -rn

Результат:

   3 192.168.0.1
   1 192.168.0.2
   1 192.168.0.3

3. Команда cut

Команда cut позволяет извлекать определённые части строк, например отдельные столбцы в CSV-файле или диапазоны символов.

Основной синтаксис

cut [опции] файл

Простой пример

Файл data.csv:

Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager

Извлечём только имена (первый столбец):

cut -d',' -f1 data.csv

Результат:

Alice
Bob
Charlie

Где:

  • -d',' — разделитель (запятая).
  • -f1 — поле (столбец) для извлечения.

Ключевые опции cut

Выбор диапазона символов

Если наш файл data.csv состоит из фиксированной ширины колонок:

Alice      25 Developer
Bob        30 Designer
Charlie    22 Manager

Мы можем извлечь только возраст (символы с 12 по 14):

cut -c12-14 data.csv

Результат:

25
30
22

Выбор нескольких полей

Если у нас есть файл log.csv:

2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped

Выберем только дату и уровень логов (поля 1 и 2):

cut -d',' -f1,2 log.csv

Результат:

2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO

4. Практический пример: Объединение sort, uniq и cut

Возьмём лог-файл с такими данными:

user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
  1. Извлечём IP-адреса:
cut -d',' -f2 log.txt
  1. Уберём дубликаты и подсчитаем их:
cut -d',' -f2 log.txt | sort | uniq -c
  1. Отсортируем по количеству вхождений:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn

Результат:

2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
1
Задача
Docker SELF, 8 уровень, 3 лекция
Недоступна
Сортировка списка чисел
Сортировка списка чисел
1
Задача
Docker SELF, 8 уровень, 3 лекция
Недоступна
Подсчёт уникальных строк
Подсчёт уникальных строк
1
Задача
Docker SELF, 8 уровень, 3 лекция
Недоступна
Извлечение столбцов из CSV
Извлечение столбцов из CSV
1
Задача
Docker SELF, 8 уровень, 3 лекция
Недоступна
Анализ веб-логов
Анализ веб-логов
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Megazen Уровень 12
16 июля 2025
Какая же помойка. Собственные команды из "правильных ответов" не проходят проверку. Javarush окончательно забил на качество. Это даже не скотились, это просто днище.
Vadim Gudymenko Уровень 2
10 апреля 2025
Прошла такая echo "Name,Role" > names_and_roles.txt cut -d',' -f1,3 data.csv >> names_and_roles.txt
Dmitry Panfilov Уровень 21
17 марта 2025

~$ cut -d',' -f1,3 data.csv > names_and_roles.txt
~$ cat names_and_roles.txt
Name,Role
Alice,Developer
Bob,Designer
Charlie,Manager
вывод соответствует задачи, но требует чего то "Добавьте заголовок 'Name,Role' в начало файла 'names_and_roles.txt'. "
Константин Contact Уровень 20
18 марта 2025
Та же фигня 😐