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

Как команды 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 будут единственным оружием для выполнения задач.

 

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

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023