Как команды 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 есть свои уникальные преимущества.
- В Python мы работаем с переменными, мы манипулируем десятками переменных в памяти и получаем желаемый результат. Но в Shell мы работаем с файлами, что позволяет автоматизировать процесс управления тысячами файлов в нескольких строках кода.
- Команды Shell позволяют выполнять кросс-языковые задачи или склеивать несколько скриптов Python, R или даже Matlab в один мета-скрипт.
- В некоторых случаях команды оболочки могут быть более удобны, чем другие скриптовые языки (когда позволяют использовать одну строку кода вместо нескольких).
- Linux преобладает в платформах облачных вычислений, высокопроизводительных суперкомпьютерах и графических процессорах, при этом очень реально оказаться в ситуации, когда не будет доступен интерпретатор Python. Тогда Linux и Shell будут единственным оружием для выполнения задач.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: