Команда `cut` — извлечение столбцов и фрагментов строк

Зачем нужна команда cut

Команда cut используется для извлечения определённых частей строк из файла или потока данных. Это особенно полезно при работе с табличными файлами (например, CSV или TSV), когда нужно быстро получить определённый столбец или диапазон данных.

Пример файла example_data.txt (значения разделены табуляцией или запятыми):

Иванов\tИван\t30,Россия
Петров\tАлексей\t25,Казахстан
Смирнова\tМария\t40,Беларусь

Базовое использование: извлечь первое поле

Если разделитель — табуляция, можно извлечь фамилии:

cut -f1 example_data.txt

Результат:

Иванов
Петров
Смирнова

Выбор разделителя (-d)

Если поля разделены запятой (например, в CSV), нужно указать нужный разделитель:

cut -d',' -f2 example_data.txt

Результат (извлекаем страну):

Россия
Казахстан
Беларусь

Извлечение нескольких полей (-f)

Можно извлечь сразу несколько столбцов, например фамилию и имя:

cut -f1,2 example_data.txt

Если используется запятая, не забудьте указать разделитель:

cut -d',' -f1 example_data.txt

Результат (данные до запятой):

Иванов Иван 30
Петров Алексей 25
Смирнова Мария 40

Обратный выбор (–complement)

Показать все поля, кроме указанных:

cut --complement -f1 example_data.txt

Результат:

Иван    30,Россия
Алексей 25,Казахстан
Мария   40,Беларусь

Расширенное извлечение: диапазоны

Извлечь поля с 2 по 3 (если, например, они разделены пробелами):

cut -d' ' -f2-3 example_data.txt

Результат:

Иван 30,Россия
Алексей 25,Казахстан
Мария 40,Беларусь

Распространённые ошибки

  • cut: delimiter must be a single character-d принимает только ОДИН символ, например ‘,’, а не “, “.

  • cut: fields and positions are numbered from 1 — нумерация начинается с 1, а не с 0.

Советы по отладке

  1. Используйте cat -A filename для отображения символов табуляции и перевода строки.

  2. Если cut не работает как ожидалось — возможно, данные разделены пробелами, а не табами.

  3. Используйте tr для замены разделителей перед использованием cut.

Пример:

cat example_data.txt | tr '\t' ',' | cut -d',' -f1