Используйте возможности 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.