История о том, как использование оболочки Linux может повысить вашу производительность.
Linux Shell
Какой язык программирования первым приходит в голову, если говорить о парсинге файлов или предобработке данных? Это может быть Python, R или некоторые другие скриптовые языки. Это современные высокоуровневые и очень мощные языки, которые, как правило, дают возможность достичь своих целей менее чем за несколько десятков строк кода.
Блогер Фрэнк Ли (Frank Li) считает “забытой жечужиной” команды Linux Shell, поскольку у них относительно древний синтаксис и меньше простых обучающих пособий в интернете. В своем посте он рассказал об одной конкретной утилите — awk.
Часто входным файлом для определенной программы должен быть файл .tsv или файлы, разграниченные табуляцией, тогда как у нас есть только файл .csv (от англ. Comma-Separated Values — значения, разделённые запятыми) из Microsoft Excel.
Исходный CSV-файл
Нужно просто ввести одну строку кода в терминал:
awk '{$1=$1}1' FS="," OFS="\t" file4.csv > file4.txt
Получаем:
Полученный CSV-файл
Теперь немного углубимся в сам синтаксис. Эта команда делает следующее:
Затем просто укажите свой входной файл и путь к выходному файлу, куда 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. А теперь — классическая задача, которая поможет понять базовый синтаксис команды.
Представьте, что у вас есть такой файл:
Файл с данными
Как узнать сумму col3? Можно ли сделать это одной строкой кода? Это полезно, потому что в реальной жизни входной файл может содержать миллион строк, а не четыре, как в примере.
$ awk 'BEGIN{FS="\t";count=0}{if(NR>1){count+=$3}}END{print count}' file6.txt 171
Проиллюстрируем механизмы:
Как работает awk
Команда awk обрабатывает файл построчно, но что-то выполнит в BEGIN перед тем, как углубиться в каждую строку, а что-то выполнит после завершения обработки каждой строки. Это свойство позволяет легко вычислять среднее значение или сумму. Таким образом, многие задачи можно решить в Linux Shell, просто используя awk.
Зачем вообще изучать команды Shell, учитывая, что Python может решать большинство задач в более структурированном формате? Ответ таков: у Shell есть свои уникальные преимущества.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…