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
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ