Используйте возможности AWK на реальных примерах



AWK появился еще в 1977 году и представляет собой язык программирования, предназначенный для обработки текста, который используется в основном для обработки данных. В мире науки о данных и инженерии данных язык AWK является отличным инструментом для обработки данных. В этом посте мы попытаемся раскрыть всю мощь AWK на примерах.

В демонстрационных целях мы будем работать со следующими простыми файлами, и вы можете следовать им!

Например.csv:

ID,Name,Dept,Gender
1,George,DS,M
2,Billy,DS,M
3,Nick,IT,M
4,George,IT,M
5,Nikki,HR,F
6,Claudia,HR,F
7,Maria,Sales,F
8,Jimmy,Sales,M
9,Jane,Marketing,F
10,George,DS,M

Записи и поля в AWK

AWK работает с текстовыми файлами. Разделителем полей по умолчанию является пробел, а разделителем записей по умолчанию является новый перевод строки \n. Однако мы можем определить записи и поля. Прежде чем мы приведем несколько конкретных примеров, давайте сосредоточимся на наиболее важных встроенных переменных:

  • NR: сохраняет текущее количество входных записей
  • NF: сохраняет количество полей текущей записи
  • FS: разделитель полей ввода, где по умолчанию используется пробел.
  • RS: разделитель входных записей, где по умолчанию используется перевод новой строки.
  • OFS: разделитель полей вывода
  • ORS: разделитель выходных записей

У вас будет четкое представление о встроенных переменных со следующими примерами.

Как вернуть первые строки файла

Что мы делаем в первую очередь, когда получаем файл? Проще говоря, нужно запустить команду «голова», чтобы получить представление о данных. Давайте посмотрим, как мы можем вернуть первые 5 строк с помощью AWK. Обратите внимание, что мы используем параметр NR (NR‹=5).

awk 'NR<=5 {print}' eg.csv

Допустим, что мы хотим вернуть с 6-й по 10-ю строку, мы легко можем сделать это следующим образом:

awk 'NR<=10 && NR>=6 {print}' eg.csv

Наконец, предположим, что мы хотим вернуть строки с 6-й по 10-ю плюс заголовок, который является первой строкой.

awk '(NR<=10 && NR>=6)||(NR==1) {print}' eg.csv

Как фильтровать строки

Мы можем легко фильтровать строки на основе некоторых условий. В следующем примере мы вернем все строки, содержащие строку Sales.

awk '/Sales/ {print}' eg.csv

Точно так же мы можем вернуть все строки, содержащие строку « HR» или строку «Sales».

awk '/HR|Sales/ {print}' eg.csv

Мы можем использовать другие регулярные выражения. Например, мы ищем строки, содержащие строку Geo, за которой следует что-то, а затем IT:

awk '/Geo.*IT/ {print}' eg.csv

Более того, мы можем вернуть строки, НЕ содержащие требуемой строки. Например, мы хотим вернуть строки, не содержащие HRили Sales.

awk '!/HR|Sales/ {print}' eg.csv

Как выбрать столбцы

Первое, чему мы можем научиться, это как выбирать столбцы в AWK. Но прежде чем мы отправимся туда, давайте посмотрим, как мы можем распечатать файл. Команда:

awk '{print}' eg.csv

Обратите внимание, что мы можем распечатать все строки, запустив:

awk '{print $0}' eg.csv

Если мы хотим вернуть определенные столбцы, мы можем использовать символ $ и номер требуемого столбца. Обратите внимание, что разделителем по умолчанию является «пробел», но мы можем изменить его, используя параметр «F» или переменную «FS». Допустим, мы хотим вернуть 2-й и 4-й столбец.

awk -F ',' '{print $2, $4}' eg.csv

Or

awk '{print $2, $4}' FS=',' eg.csv

Or

awk 'BEGIN{FS=","} {print $2, $4}' eg.csv

Как видите, мы успешно вернули требуемые столбцы.

Советы: разделитель не обязательно заключать в кавычки, если только он не является регулярным выражением. Наконец, если разделителем является табуляция, вы можете указать ее с помощью \t.

Как фильтровать строки на основе условий столбцов

Мы уже видели, как фильтровать строки путем поиска строки в строке и как выбирать столбцы. Теперь мы можем увидеть, как фильтровать строки на основе некоторых условий в определенных столбцах.

Например, предположим, что нам нужны все строки, в которых departmentравно DS.

awk -F"," '$3=="DS" {print $0}' eg.csv

Обратите внимание, что отдел — это третий столбец.

Допустим, мы хотим вернуть все строки, где ID больше 5.

awk -F"," '$1>5{print $0}' eg.csv

Мы также можем получить строки, в которых определенный столбец содержит подстроку. В этом случае нам нужно использовать символ «~» плюс косую черту «/» для регулярного выражения. Например, давайте получим все строки, где есть подстрока Ge во втором столбце.

awk -F"," '$2~/Ge/{print $0}' eg.csv

Если бы мы хотели инвертировать выражение, то есть строки, в которых имя столбца не содержит подстроки Ge, мы могли бы запустить:

awk -F"," '$2!~/Ge/{print $0}' eg.csv

Наконец, если мы хотим получить точное совпадение, например получить все строки с именем George:

awk -F"," '$2=="George"{print $0}' eg.csv

а для обратного выражения:

awk -F"," '$2!="George"{print $0}' eg.csv

Как изменить разделитель

Существует как минимум два разных способа изменить разделитель файла. Предположим, я хочу преобразовать файл CSV в TSV.

awk -F "," '{print $1 "\t" $2 "\t" $3 "\t" $4}' eg.csv

Or

awk 'BEGIN{FS=",";OFS="\t"} {print $1, $2, $3, $4}' eg.csv

Мы также можем сохранить файл TSV следующим образом:

awk 'BEGIN{FS=",";OFS="\t"} {print $1, $2, $3, $4}' eg.csv > eg.tsv

Как объединить поля

Мы можем легко объединить поля с операторами печати. Допустим, мы хотим добавить --> между Nameи Gender.

awk -F "," '{print $2 "-->" $4}' eg.csv

Как распечатать количество полей по записи

Как мы упоминали ранее, мы можем указать разделитель полей. С помощью AWK мы можем получить количество полей по строке. Например:

awk -F "," '{print NF, $0}' eg.csv

Как мы видим, мы получили 4 для каждой записи, как и ожидалось, поскольку у нас четыре поля.

Как подсчитать строки файла

Другая очень распространенная задача — получить количество строк в файле. В Unix мы можем получить это следующим образом:

cat eg.csv | wc -l

Используя AWK, мы можем запустить эквивалентную команду следующим образом:

awk 'END {print NR}' eg.csv

Неудивительно, что в обоих случаях мы получили 11.

Как получить сумму столбца

Допустим, мы хотим получить сумму столбца ID. Мы можем легко сделать это следующим образом:

awk -F "," '{mysum+= $1} END {print mysum}' eg.csv

Как мы видим, мы получили 55 (=1+2+3+4+5+6+7+8+9+10). В приведенной выше команде мы определили переменную с именем mysum, где для каждой строки мы добавляем соответствующую запись первого столбца ($1).

Как объединить несколько файлов CSV

Допустим, у нас есть много CSV-файлов одного формата и мы хотим объединить их в один файл, но хотим сохранить только заголовок первого файла! Мы можем сделать это с помощью AWK следующим образом:

awk '(NR == 1) || (FNR > 1)' my_file_*.csv > merged.csv

FNR относится к количеству обработанных записей в одном файле, а NR относится ко всем файлам, поэтому мы сохраняем первую строку, которая является заголовком, и игнорируем первые строки каждого файла.

Наконец, если вы хотите удалить заголовки из всех файлов:

awk 'FNR > 1' my_file_*.csv > merged.csv

Заключительные слова

Я твердо верю, что специалисты по данным и инженеры данных должны иметь относительно хороший опыт работы с UNIX, чтобы их можно было использовать в основном для задач обработки текста и конвейеров данных. AWK — действительно мощный инструмент для задач очистки данных, и это хороший технический навык.

Цель этого руководства состояла в том, чтобы познакомить вас с миром AWK. Есть много других вещей, которые мы можем делать с AWK, и если вы хотите узнать больше, то единственное, что вам нужно сделать, это оставаться в курсе!

Первоначально опубликовано на https://predictivehacks.com.