Рубріки: Решения

Как команды Linux Shell могут сэкономить время

Мария Мельник

История о том, как использование оболочки Linux может повысить вашу производительность.

Linux Shell

Какой язык программирования первым приходит в голову, если говорить о парсинге файлов или предобработке данных? Это может быть Python, R или некоторые другие скриптовые языки.  Это современные высокоуровневые и очень мощные языки, которые, как правило, дают возможность достичь своих целей менее чем за несколько десятков строк кода.

Блогер Фрэнк Ли (Frank Li) считает “забытой жечужиной” команды Linux Shell, поскольку у них относительно древний синтаксис и меньше простых обучающих пособий в интернете. В своем посте он рассказал об одной конкретной утилите — awk.

У меня есть файл CSV, как поменять разделитель на табуляцию?

Часто входным файлом для определенной программы должен быть файл .tsv или файлы, разграниченные табуляцией, тогда как у нас есть только файл .csv (от англ. Comma-Separated Values — значения, разделённые запятыми) из Microsoft Excel. 

Исходный CSV-файл

Нужно просто ввести одну строку кода в терминал:

awk '{$1=$1}1' FS="," OFS="\t" file4.csv > file4.txt

Получаем:

Полученный CSV-файл

Теперь немного углубимся в сам синтаксис. Эта команда делает следующее:

  • {$ 1 = $ 1}1 : сбрасывает буфер
  • FS = “,” : сообщает awk текущий разделитель — ,
  • OFS = “\t” : сообщает awk желаемый разделитель — \t

Затем просто укажите свой входной файл и путь к выходному файлу, куда awk выведет результат. Готово!

Это несложно сделать и на Python или R, но просто ввести одну команду в терминале удобнее, чем открывать Python IDE, читать файл и переписывать его с другим разделителем. При этом не нужно беспокоиться о настройке среды и установке пакетов.

Как сделать горизонтальные выходы вертикальными?

Допустим, у вас есть следующий файл:

Горизонтальный вывод

Чтобы отобразить данные вертикально, понадобится всего одна строка кода:

awk '{for(i=1;i<=NF;i++){print $i}}' file5.txt > file5_new.txt

Как будет выглядеть файл?

Вертикальный вывод

Команда awk для каждой строки (в этом входном файле только одна строка) перебирает столбец, начиная с индекса i = 1 (первый столбец) и заканчивая i = NF, где NF — специальная переменная в awk, обозначающая длину каждой строки.

А что если есть вертикальный вывод, но вы бы хотели, чтобы он снова отображался горизонтально?

cat file5_new.txt | tr '\n' ' ' | awk '{$1=$1}1' FS=" " OFS="\t" > file5_restore.txt

Вот результат:

Снова горизонтальный формат

Объяснение команды: мы сначала читаем файл с помощью cat, затем заменяем символ новой строки для каждой строки на пробел с помощью команды tr. Затем мы снова используем команду awk, чтобы просто изменить разделитель с пробела на табуляцию.

Задача на понимание awk

Мы уже получили представление о том, насколько мощна awk. А теперь — классическая задача, которая поможет понять базовый синтаксис команды.

Представьте, что у вас есть такой файл:

Файл с данными

Как узнать сумму col3? Можно ли сделать это одной строкой кода? Это полезно, потому что в реальной жизни входной файл может содержать миллион строк, а не четыре, как в примере.

$ ​awk 'BEGIN{FS="\t";count=0}{if(NR>1){count+=$3}}END{print count}' file6.txt

171

Проиллюстрируем механизмы:

Как работает awk

  • BEGIN: выполняется до обработки каждой строки
  • MAIN: выполняется при обработке каждой строки
  • END: выполняется после обработки каждой строки
  • FS: разделитель входного файла
  • OFS: разделитель выходного файла
  • NR: номер строки
  • NF: длина каждой строки

Команда awk обрабатывает файл построчно, но что-то выполнит в BEGIN перед тем, как углубиться в каждую строку, а что-то выполнит после завершения обработки каждой строки.  Это свойство позволяет легко вычислять среднее значение или сумму. Таким образом, многие задачи можно решить в Linux Shell, просто используя awk.

Почему Linux и Shell вообще полезны

Зачем вообще изучать команды Shell, учитывая, что Python может решать большинство задач в более структурированном формате? Ответ таков: у Shell есть свои уникальные преимущества.

  1. В Python мы работаем с переменными, мы манипулируем десятками переменных в памяти и получаем желаемый результат.  Но в Shell мы работаем с файлами, что позволяет автоматизировать процесс управления тысячами файлов в нескольких строках кода.
  2. Команды Shell позволяют выполнять кросс-языковые задачи или склеивать несколько скриптов Python, R или даже Matlab в один мета-скрипт.
  3. В некоторых случаях команды оболочки могут быть более удобны, чем другие скриптовые языки (когда позволяют использовать одну строку кода вместо нескольких).
  4. Linux преобладает в платформах облачных вычислений, высокопроизводительных суперкомпьютерах и графических процессорах, при этом очень реально оказаться в ситуации, когда не будет доступен интерпретатор Python.  Тогда Linux и Shell будут единственным оружием для выполнения задач.

 

Останні статті

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024