Это команда mawk, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
mawk - язык сканирования шаблонов и обработки текста
СИНТАКСИС
Mawk [-W вариант] [-F ценностное ] [-v var = значение] [-] 'текст программы' [файл ...]
Mawk [-W вариант] [-F ценностное ] [-v var = значение] [-f программный файл] [--] [файл ...]
ОПИСАНИЕ
Mawk является интерпретатором языка программирования AWK. Язык AWK полезен для
манипулирование файлами данных, поиск и обработка текста, а также для создания прототипов и
экспериментируем с алгоритмами. Mawk - это new AWK это означает, что он реализует язык AWK
как определено у Ахо, Кернигана и Вайнбергера, Ассоциация AWK Программирование Язык, Эддисон-Уэсли
Publishing, 1988. (Далее - книга AWK.) Mawk соответствует Posix
1003.2 (проект 11.3) определение языка AWK, которое содержит несколько функций, не
описано в книге AWK, и Mawk предоставляет небольшое количество расширений.
Программа AWK - это последовательность описания {действие} пары и определения функций. короткий
программы вводятся в командной строке, обычно заключаются в '', чтобы избежать оболочки
интерпретация. Более длинные программы можно прочитать из файла с помощью опции -f. Данные
ввод читается из списка файлов в командной строке или из стандартного ввода, когда
список пуст. Входные данные разбиваются на записи в соответствии с разделителем записей.
Переменная, RSв конечном итоге. Изначально, RS = "\ n" и записи являются синонимами строк. Каждая запись
по сравнению с каждым описания и если он совпадает, текст программы для {действие} is
казнены.
ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ, НЕ ВКЛЮЧЕННЫЕ В ПАКЕТ
-F ценностное устанавливает разделитель полей, FSдо ценностное .
-f файл Текст программы читается из файл вместо командной строки. Несколько
-f варианты разрешены.
-v var = значение правопреемники ценностное программировать переменную вар.
- указывает на однозначный конец опций.
Вышеуказанные параметры будут доступны в любой реализации AWK, совместимой с Posix, и
параметры, специфичные для реализации, предваряются -W. Mawk обеспечивает шесть:
-W версия Mawk записывает свою версию и авторские права в стандартный вывод, а скомпилированные ограничения - в
stderr и выходит из 0.
-W dump записывает ассемблерный листинг внутреннего представления
программа в стандартный вывод и завершает работу 0 (при успешной компиляции).
-W Interactive устанавливает небуферизованную запись в стандартный вывод и чтение с буферизацией строки из стандартного ввода.
Записи из stdin являются строками независимо от значения RS.
-W Exec файл Текст программы читается из файл и это последний вариант. Полезно на
системы, которые поддерживают #! соглашение о "магическом числе" для исполняемого файла
скриптов.
-W sprintf =Num регулирует размер mawk's внутренний буфер sprintf в Num байтов. Больше, чем
редкое использование этой опции указывает Mawk следует перекомпилировать.
-W posix_space force Mawk не считать '\ n' пробелом.
Краткие формы -W[vdiesp] распознаются и в некоторых системах -We является обязательным, чтобы избежать
ограничения длины командной строки.
AWK АНГЛИЙСКИЙ ЯЗЫК
1. FitPartner™ Структура
Программа AWK - это последовательность описания {действие} пары и определения пользовательских функций.
Выкройка может быть:
НАЧАТЬ
END
выражение
выражение, выражение
Один, но не оба из описания {действие} можно не указывать. Если {действие} опущено это
неявно {print}. Если описания опускается, то он неявно сопоставляется. НАЧАТЬ и
END шаблоны требуют действия.
Операторы заканчиваются новой строкой, точкой с запятой или обоими. Группы утверждений, такие как
действия или тела цикла блокируются через {...}, как в C. Последний оператор в блоке
не нужен терминатор. Пустые строки не имеют значения; пустой оператор завершается
с точкой с запятой. Длинные операторы могут продолжаться обратной косой чертой, \. Заявление может
быть разбитым без обратной косой черты после запятой, левой фигурной скобки, &&, ||, do, еще, право
скобка if, в то время как or для оператор и правая скобка функции
определение. Комментарий начинается с символа # и продолжается до, но не включает конец строки.
Следующие операторы управляют потоком программы внутри блоков.
if ( выраж ) заявление
if ( выраж ) заявление еще заявление
в то время как ( выраж ) заявление
do заявление в то время как ( выраж )
для ( opt_expr ; opt_expr ; opt_expr ) заявление
для ( вар in массив ) заявление
продолжать
перерыв
2. Данные типы, Преобразование и сравнение
Существует два основных типа данных: числовые и строковые. Числовые константы могут быть целыми, например
-2, десятичная дробь, такая как 1.08, или в экспоненциальном представлении, например, -1.1e4 или .28E-3. Все числа
представлены внутри, и все вычисления выполняются в арифметике с плавающей запятой. Таким образом, для
Например, выражение 0.2e2 == 20 истинно, а истинное представлено как 1.0.
Строковые константы заключаются в двойные кавычки.
«Это строка с новой строкой в конце. \ N»
Строки могут быть продолжены через строку, экранируя (\) символ новой строки. Следующий побег
последовательности распознаются.
\\\
\ ""
\ предупреждение, ascii 7
\ b backspace, ascii 8
\ t tab, ascii 9
\ n перевод строки, ascii 10
\ v вертикальная табуляция, ascii 11
\ f formfeed, ascii 12
\ r возврат каретки, ascii 13
\ ddd 1, 2 или 3 восьмеричные цифры для ascii ddd
\ xhh 1 или 2 шестнадцатеричные цифры для ascii hh
Если вы экранируете любой другой символ \ c, вы получите \ c, т.е. Mawk игнорирует побег.
На самом деле существует три основных типа данных; третий номер и string который имеет как
числовое значение и строковое значение одновременно. Пользовательские переменные входят в
существование при первой ссылке и инициализации нуль, число и строковое значение
который имеет числовое значение 0 и строковое значение "". Нетривиальные числовые и строковые данные
поступают из ввода и обычно хранятся в полях. (См. Раздел 4).
Тип выражения определяется его контекстом и автоматическим преобразованием типа.
происходит при необходимости. Например, чтобы оценить утверждения
у = х + 2; z = x "привет"
Значение, хранящееся в переменной y, будет числовым. Если x не числовой, значение читается
из x преобразуется в числовое перед добавлением к 2 и сохранением в y. Сохраненное значение
в переменной z будет введена строка, а значение x будет преобразовано в строку, если
необходимо и в сочетании с "привет". (Конечно, значение и тип, хранящиеся в x,
не изменяется никакими преобразованиями.) Строковое выражение преобразуется в числовое, используя его
самый длинный числовой префикс, как с в(3). Числовое выражение преобразуется в строку с помощью
заменив выраж sprintf (CONVFMT, выраж), если выраж может быть представлен на хосте
машины как точное целое число, затем оно преобразуется в Sprintf("% d", выраж). Sprintf () есть
Встроенный AWK, который дублирует функциональность Sprintf(3), и КОНВФМТ это встроенный
переменная, используемая для внутреннего преобразования из числа в строку и инициализированная как "% .6g".
Явные преобразования типов могут быть принудительными, выраж "" - строка, а выраж+0 - числовой.
Оценить, выраж1 повторная операция выраж2, если оба операнда числовые или числовые и строковые, тогда
сравнение числовое; если оба операнда строковые, сравнение будет строковым; если один
операнд является строкой, операнд, не являющийся строкой, преобразуется, и сравнение является строкой. В
результат числовой, 1 или 0.
В логических контекстах, таких как, if ( выраж ) заявление, строковое выражение оценивается как истина, если
и только если это не пустая строка ""; числовые значения тогда и только тогда, когда не числовые
нулю.
3. Стандарт выражения
В языке AWK записи, поля и строки часто проверяются на соответствие регулярный
выражение. Регулярные выражения заключаются в косую черту, а
выраж ~/r/
- выражение AWK, которое принимает значение 1, если выраж "Матчи" r, что означает подстроку
выраж находится в наборе строк, определяемых r. При отсутствии совпадения выражение оценивается как 0;
замена ~ оператором "не соответствует"! ~ меняет значение на противоположное. Как паттерн-действие
пары,
/r/ { действие } а также $0 ~/r/ { действие }
одинаковы, и для каждой входной записи, которая соответствует r, действие выполняется. По факту, /r/
является выражением AWK, эквивалентным ($0 ~/r/) где угодно, кроме правого
стороне оператора сопоставления или передается в качестве аргумента встроенной функции, которая ожидает
аргумент регулярного выражения.
AWK использует расширенные регулярные выражения, как в задать расширенное(1). Регулярное выражение
метасимволы, т. е. те, которые имеют особое значение в регулярных выражениях:
^ $. [] | () * +?
Регулярные выражения состоят из следующих символов:
c соответствует любому неметасимволу c.
\c соответствует символу, определяемому теми же escape-последовательностями, которые используются в
строковые константы или буквальный символ c если \c это не побег
последовательность.
. соответствует любому символу (включая новую строку).
^ соответствует началу строки.
$ соответствует концу строки.
[c1c2c3 ...] соответствует любому символу в классе c1c2c3 .... Интервал
символы обозначаются c1-c2 внутри класса [...].
[^ c1c2c3 ...] соответствует любому символу не из класса c1c2c3 ...
Регулярные выражения создаются из других регулярных выражений следующим образом:
r1r2 соответствует r1, за которым сразу следует r2 (конкатенация).
r1 | r2 соответствует r1 или r2 (чередование).
r* Матчи r повторяется ноль или более раз.
r+ совпадения r повторяется один или несколько раз.
r? Матчи r ноль или один раз.
(r) Спички r, обеспечивающий группировку.
Возрастающий приоритет операторов - это чередование, конкатенация и унарный (*, + или
?).
Например,
/ ^ [_ a-zA-Z] [_ a-zA-Z0-9] * $ / и
/^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$/
соответствуют идентификаторам AWK и числовым константам AWK соответственно. Обратите внимание, что . должен
быть экранированным, чтобы распознаваться как десятичная точка, и что метасимволы не являются специальными
внутри классов персонажей.
Любое выражение можно использовать в правой части операторов ~ или! ~ Или передать в
встроенный, ожидающий регулярного выражения. При необходимости он преобразуется в строку, и
затем интерпретируется как регулярное выражение. Например,
НАЧАТЬ {идентификатор = "[_a-zA-Z] [_ a-zA-Z0-9] *"}
$ 0 ~ "^" идентификатор
печатает все строки, начинающиеся с идентификатора AWK.
Mawk распознает пустое регулярное выражение //, которое соответствует пустой строке и, следовательно,
соответствует любой строке спереди, сзади и между каждым символом. Например,
эхо abc | mawk {gsub (//, "X"); Распечатать }
ХаХbХсХ
4. документация и поля
Записи читаются по очереди и сохраняются в поле переменная $0. Рекорд
разделить на поля которые хранятся в $1, $2..., $ NF. Встроенная переменная NF установлен
к количеству полей и NR и FNR увеличиваются на 1. Поля выше $ NF установлены на
"".
Присвоение $0 вызывает поля и NF для пересчета. Присвоение NF или к
полевые причины $0 будет восстановлен путем конкатенации $ i's разделены по ОФС.
Присвоение полю с индексом больше, чем NF, увеличивается NF и причины $0 быть
реконструированы.
Ввод данных, хранящихся в полях, является строкой, если все поле не имеет числовой формы, а затем
тип - число и строка. Например,
эхо 24 24E |
mawk '{print ($ 1> 100, $ 1> "100", $ 2> 100, $ 2> "100")}'
0 1 1 1
$0 и $2 струны и $1 это число и строка. Первое сравнение числовое,
вторая строка, третья строка (100 преобразуется в "100"), а последняя строка.
5. Expressions и Операторы
Синтаксис выражения аналогичен синтаксису C. Первичные выражения - это числовые константы, строка.
константы, переменные, поля, массивы и вызовы функций. Идентификатор переменной,
массив или функция может быть последовательностью букв, цифр и знаков подчеркивания, которая не
начать с цифры. Переменные не объявляются; они существуют при первом упоминании и
инициализирован нуль.
Новые выражения составляются с помощью следующих операторов в порядке увеличения
приоритет.
назначение = + = - = * = / =% = ^ =
условный ? :
логический or ||
логический и &&
массив членство in
согласование ~! ~
реляционный <> <=> = ==! =
конкатенация (без явного оператора)
Добавить ОПС + -
мул ОПС * /%
унарный + -
логический не !
экспоненцирование ^
вкл и декабрь ++ - (как после, так и до)
поле $
Присваивание, условное выражение и возведение в степень связываются справа налево; другие операторы
ассоциировать слева направо. В скобках можно заключить любое выражение.
6. Массивы
Awk предоставляет одномерные массивы. Элементы массива выражаются как массив[выраж]. Expr
внутренне преобразуется в строковый тип, поэтому, например, A [1] и A ["1"] одинаковы
элемент, а фактический индекс равен «1». Массивы, индексируемые строками, называются ассоциативными.
массивы. Первоначально массив пуст; элементы существуют при первом доступе. Выражение,
выраж in массив оценивается в 1, если массив[выраж] существует, иначе 0.
Есть форма для оператор, который перебирает каждый индекс массива.
для ( вар in массив ) заявление
Наборы вар к каждому индексу массив и выполняет заявление. Порядок, который вар пересекает
индексы массив не определен.
Заявление, удалять массив[выраж], причины массив[выраж] не существовать. Mawk поддерживает
расширение, удалять массив, который удаляет все элементы массив.
Многомерные массивы синтезируются конкатенацией с использованием встроенной переменной
ПОДПИСЬ. массив[выраж1,выраж2] эквивалентно массив[выраж1 ПОДПИСЬ выраж2]. Тестирование на
многомерный элемент использует индекс в скобках, например
if ((i, j) in A) выведите A [i, j]
7. Встроенные переменные
Следующие переменные встроены и инициализируются перед выполнением программы.
АРГК количество аргументов командной строки.
АРГВ массив аргументов командной строки, 0..ARGC-1.
КОНВФМТ формат для внутреннего преобразования чисел в строку, изначально = "% .6g".
ОКРУЖАЮЩАЯ СРЕДА массив, проиндексированный переменными среды. Строка среды, var = значение
хранится как ОКРУЖАЮЩАЯ СРЕДА[варзнак равно ценностное .
ИМЯ ФАЙЛА имя текущего входного файла.
FNR номер текущей записи в ИМЯ ФАЙЛА.
FS разбивает записи по полям как регулярное выражение.
NF количество полей в текущей записи.
NR номер текущей записи в общем входном потоке.
ОФМТ формат для печати чисел; Первоначально = "% .6g".
ОФС вставляется между полями при выводе, изначально = "".
ORS завершает каждую запись на выходе, первоначально = "\ n".
ДЛИНА длина, установленная последним вызовом встроенной функции, матч().
RS разделитель входных записей, изначально = "\ n".
RСТАРТ индекс, установленный последним вызовом матч().
ПОДПИСЬ используется для построения нескольких индексов массива, первоначально = "\ 034".
8. Встроенный Функции
Строковые функции
gsub (г, с, т) gsub (R, S)
Глобальная подстановка, каждое совпадение регулярного выражения r в переменной t is
заменено строкой s. Возвращается количество замен. Если t is
опущено, $0 используется. & В строке замены s заменяется
согласованная подстрока t. \ & и \\ помещают буквальные & и \, соответственно, в
строка замены.
индекс(S, T)
If t является подстрокой s, то позиция, где t запускается, иначе
0 возвращается. Первый персонаж s находится в позиции 1.
длина(s)
Возвращает длину строки s.
соответствие(s, r)
Возвращает индекс первого самого длинного совпадения регулярного выражения. r in
string s. Возвращает 0, если совпадений нет. В качестве побочного эффекта RСТАРТ устанавливается в
возвращаемое значение. ДЛИНА устанавливается равная длине совпадения или -1, если совпадения нет.
Если совпадает пустая строка, ДЛИНА установлен в 0, и 1 возвращается, если
спичка спереди, а длина (s) +1 возвращается, если совпадение находится на
спина.
расколоть(s, A, r) расколоть(с, А)
строка s разбивается на поля регулярным выражением r и поля
загружен в массив A. Возвращается количество полей. См. Раздел 11
ниже для более подробной информации. Если r опущен, FS используется.
Sprintf (формат, список-выражений)
Возвращает строку, построенную из expr-список по данным формат. Смотреть
описание printf () ниже.
sub (г, с, т) sub (R, S)
Одиночная подстановка, такая же, как и в gsub (), за исключением одной подстановки.
substr (с, я, п) substr (с, я)
Возвращает подстроку строки s, начиная с индекса i, длины n. Если n
опускается, суффикс s, Начиная с i возвращается.
снизить(s)
Возвращает копию s со всеми символами верхнего регистра, преобразованными в нижний регистр.
toupper (s)
Возвращает копию s со всеми символами нижнего регистра, преобразованными в верхний регистр.
Арифметические функции
atan2 (у, х) Арктан из y/x между -pi и pi.
соз (x) Косинусная функция, x в радианах.
ехр (x) Экспоненциальная функция.
INT (x) Возврат x усечен в сторону нуля.
журнал(x) Натуральный логарифм.
rand () Возвращает случайное число от нуля до единицы.
грех (x) Функция синуса, x в радианах.
SQRT (x) Возвращает квадратный корень из x.
srand (выраж) srand ()
Заполняет генератор случайных чисел, используя часы, если выраж опущено, и
возвращает значение предыдущего семени. Mawk засевает случайное число
генератор от часов при запуске, поэтому нет реальной необходимости вызывать
srand (). Шранд (выраж) полезен для повторения псевдослучайных последовательностей.
9. вход и выходной
Есть два выходных оператора, Распечатать и Printf.
печать пишет $0 ORS на стандартный вывод.
Распечатать выраж1, выраж2, ..., выражn
пишет выраж1 ОФС выраж2 ОФС ... выражn ORS на стандартный вывод. Числовой
выражения преобразуются в строку с ОФМТ.
Printf формат, expr-список
дублирует запись функции библиотеки printf на стандартный вывод. В
полные спецификации формата ANSI C распознаются с преобразованием% c,
% d,% e,% E,% f,% g,% G,% i,% o,% s,% u,% x,% X и %%, а также преобразование
квалификаторы h и l.
Список аргументов для print или printf можно дополнительно заключить в круглые скобки. Распечатать
форматирует числа, используя ОФМТ или "% d" для точных целых чисел. "% c" с числовым аргументом
печатает соответствующий 8-битный символ, со строковым аргументом печатает первый
символ строки. Вывод print и printf может быть перенаправлен в файл или
команду, добавив> файл, >> файл золото | команду до конца оператора печати.
Открывается перенаправление файл or команду только один раз, последующие перенаправления добавляются к уже
открытый поток. Условно, Mawk связывает имя файла "/ dev / stderr"с помощью stderr, который
позволяет перенаправить print и printf на stderr. Mawk также ассоциирует "-" и
«/ dev / stdout» с stdin и stdout, который позволяет передавать эти потоки функциям.
Функция ввода Getline имеет следующие варианты.
Getline
читает в $0, обновляет поля, NF, NR и FNR.
Getline файл
читает в $0 от файл, обновляет поля и NF.
Getline вар
читает следующую запись в вар, обновления NR и FNR.
Getline вар < файл
читает следующую запись файл в вар.
команду | Getline
трубит запись от команду в $0 и обновляет поля и NF.
команду | Getline вар
трубит запись от команду в вар.
Getline возвращает 0 в конце файла, -1 в случае ошибки, в противном случае - 1.
Команды на конце каналов выполняются / bin / sh.
Функция Закрыть(выраж) закрывает файл или канал, связанный с выраж. Close возвращает 0, если
выраж это открытый файл, статус выхода, если выраж - конвейерная команда, иначе -1. Закрывать
используется для повторного чтения файла или команды, убедитесь, что другой конец выходного канала завершен
или сберечь файловые ресурсы.
Функция смывать(выраж) очищает выходной файл или канал, связанный с выраж. Смыв
возвращает 0, если выраж это открытый выходной поток else -1. Fflush без аргумента сбрасывает
стандартный вывод. Fflush с пустым аргументом ("") сбрасывает весь открытый вывод.
Функция система(выраж) использует / Бен / ш выполнить выраж и возвращает статус выхода
команду выраж. Изменения, внесенные в ОКРУЖАЮЩАЯ СРЕДА массив не передается командам, выполняемым с
система или трубы.
10. Информация о пользователе определенный Функции
Синтаксис пользовательской функции:
функция имя( арг ) { отчетность }
Тело функции может содержать оператор возврата
возвращают opt_expr
Заявление о возврате не требуется. Вызовы функций могут быть вложенными или рекурсивными. Функции
передаются выражения по значению и массивы по ссылке. Дополнительные аргументы служат местными
переменные и инициализируются нуль. Например, csplit (с, А) помещает каждый символ из s
в массив A и возвращает длину s.
функция csplit (s, A, n, i)
{
n = длина (с)
for (i = 1; i <= n; i ++) A [i] = substr (s, i, 1)
вернуть n
}
Добавление дополнительного пробела между переданными аргументами и локальными переменными является обычным делом.
На функции можно ссылаться до того, как они будут определены, но имя функции и знак '(' из
аргументы должны соприкасаться, чтобы избежать путаницы с конкатенацией.
11. расщепляющий строки, учет и файлов
Программы AWK используют тот же алгоритм для разделения строк на массивы с помощью split () и записи
в поля на FS. Mawk использует по существу тот же алгоритм для разделения файлов на записи
on RS.
Расколоть(expr, A, sep) работает следующим образом:
(1) Если сентябрь опускается, он заменяется на FS. сен может быть выражением или
регулярное выражение. Если это выражение не строкового типа, это
преобразован в строку.
(2) Если сентябрь = "" (одиночный пробел), затем отделан спереди и
сзади выражкачества сентябрь становится . Mawk определяет как обычный
выражение / [\ t \ n] +/. В противном случае сентябрь рассматривается как регулярное выражение,
за исключением того, что метасимволы игнорируются для строки длиной 1, например,
split (x, A, "*") и split (x, A, / \ * /) одинаковы.
(3) Если выраж не является строкой, она преобразуется в строку. Если выраж тогда пустой
строка "", split () возвращает 0 и A установлен пустым. В противном случае все не-
перекрывающиеся, ненулевые и самые длинные совпадения сентябрь in выраж, отдельный выраж в
поля, которые загружаются в A. Поля помещаются в A [1], A [2], ...,
A [n] и split () возвращает n, количество полей, которое является количеством
совпадений плюс один. Данные помещены в A выглядит числовым - это набранный номер и
строка.
Разделение записей на поля работает так же, за исключением того, что части загружаются в $1, $2, ...,
$ NF. Если $0 пусто, NF установлен на 0 и все $i к "".
Mawk разбивает файлы на записи по тому же алгоритму, но с той небольшой разницей, что
RS это действительно терминатор, а не разделитель. (ORS действительно тоже терминатор).
Например, если FS = ": +" и $0 = "a :: b:", тогда NF = 3 и $1 = "а", $2 = "b" и $3 =
"", но если "a :: b:" - это содержимое входного файла и RS = ": +", то есть
две записи «а» и «б».
RS = "" не особенный.
If FS = "", тогда Mawk разбивает запись на отдельные символы, и аналогично
расколоть(с, А,"") помещает отдельные символы s в A.
12. Многоканальный учет
С Mawk толкует RS как регулярное выражение, многострочные записи легко сделать. Параметр RS
= "\ n \ n +", делает одну или несколько пустых строк отдельными записями. Если FS = "" (по умолчанию),
затем одиночные символы новой строки по правилам для выше, становится пробелом, а отдельные символы новой строки
разделители полей.
Например, если это файл «ab \ nc \ n \ n», RS = "\ n \ n +" и FS = "", то есть
одна запись «ab \ nc» с тремя полями «a», «b» и «c». Изменение FS = "\ n", дает
два поля «ab» и «c»; изменение FS = "", дает одно поле, идентичное
записи.
Если вы хотите, чтобы строки с пробелами или табуляторами считались пустыми, установите RS = "\ n ([\ t] * \ n) +".
Для совместимости с другими awks, установив RS = "" действует так же, как если бы пустые строки
удаляются спереди и сзади файлов, а затем записи определяются, как если бы RS =
"\ п \ п +". Posix требует, чтобы "\ n" всегда разделяла записи, когда RS = "" независимо от
Значение FS. Mawk не поддерживает это соглашение, потому что определение "\ n" как
делает это ненужным.
В большинстве случаев, когда вы меняете RS для многострочных записей вы также захотите изменить
ORS на "\ n \ n", чтобы интервал между записями сохранялся при выводе.
13. FitPartner™ выполнение
В этом разделе описан порядок выполнения программы. Первый АРГК устанавливается на общую
количество аргументов командной строки, переданных на этап выполнения программы. ARGV [0] is
установить имя интерпретатора AWK и ARGV [1] ... ARGV [ARGC-1] держит оставшиеся
аргументы командной строки, исключая параметры и исходный код программы. Например с
mawk -f prog v = 1 A t = привет B
АРГК = 5 с ARGV [0] = "mawk", ARGV [1] = "v = 1", ARGV [2] = "А", ARGV [3] = "t = привет" и
ARGV [4] = "B".
Далее каждый НАЧАТЬ блок выполняется по порядку. Если программа полностью состоит из НАЧАТЬ
блоков, то выполнение прекращается, иначе открывается входной поток и выполнение продолжается.
If АРГК равно 1, входной поток установлен на stdin, иначе аргументы командной строки
ARGV [1] ... ARGV [ARGC-1] проверяются на предмет аргумента файла.
Аргументы командной строки делятся на три набора: аргументы файла, аргументы присваивания.
и пустые строки "". Задание имеет вид вар=string, Когда ARGV [i] исследуется
как возможный аргумент файла, если он пуст, он пропускается; если это задание
аргумент, присвоение вар происходит и i переходит к следующему аргументу; еще ARGV [i]
открыт для ввода. Если он не открывается, выполнение прекращается с кодом выхода 2. Если нет
Аргумент командной строки - это аргумент файла, тогда ввод поступает из стандартного ввода. Getline в НАЧАТЬ
действие открывает ввод. «-» в качестве аргумента файла означает стандартный ввод.
Как только входной поток открыт, каждая входная запись проверяется на соответствие каждому описания, а если это
совпадения, связанные действие выполняется. Шаблон выражения соответствует, если он
boolean true (см. конец раздела 2). А НАЧАТЬ совпадение с шаблоном до того, как какой-либо ввод будет
был прочитан, и END шаблон соответствует после того, как все входные данные были прочитаны. Образец диапазона,
выраж1,выраж2, соответствует каждой записи между совпадением выраж1 и матч выраж2
включительно.
Когда конец файла происходит во входном потоке, оставшиеся аргументы командной строки
проверяется на предмет аргумента файла, и если он есть, он открывается, иначе END описания is
считается подобранным и все END действия выполнены.
В этом примере присвоение v = 1 происходит после НАЧАТЬ действия выполняются, и
данные, помещенные в v, представляют собой типизированное число и строку. Затем ввод считывается из файла A. В конце
файла A, t устанавливается в строку «hello», а B открывается для ввода. В конце файла B,
домен END действия выполнены.
Ход программы на описания {действие} уровень можно изменить с помощью
следующий
выход opt_expr
заявления. А следующий Оператор вызывает чтение следующей входной записи и тестирование шаблона
перезапустить с первого описания {действие} пара в программе. An выход заявление причины
немедленное выполнение END действия или завершение программы, если таковых нет или если
выход происходит в END действие. В opt_expr устанавливает значение выхода программы, если
отменено более поздним выход или последующая ошибка.
ПРИМЕРЫ
1. подражать коту.
{ Распечатать }
2. подражать туалету.
{chars + = length ($ 0) + 1 # добавить единицу для \ n
слова + = NF
}
КОНЕЦ {печатать NR, слова, символы}
3. Подсчитайте количество уникальных «настоящих слов».
НАЧАТЬ {FS = "[^ A-Za-z] +"}
{for (i = 1; i <= NF; i ++) word [$ i] = ""}
КОНЕЦ {удалить слово [""]
для (я в слове) cnt ++
печать cnt
}
4. суммируйте второе поле каждой записи на основе первого поля.
$ 1 ~ / кредит | прибыль / {сумма + = $ 2}
$ 1 ~ / дебет | убыток / {сумма - = $ 2}
END {print sum}
5. отсортируйте файл, сравнив его как строку
{line [NR] = $ 0 ""} # убедитесь, что выбран тип сравнения
# если некоторые строки выглядят числовыми
КОНЕЦ {isort (строка, NR)
for (i = 1; i <= NR; i ++) строка печати [i]
}
#insertion sort of A [1..n]
функция isort (A, n, i, j, удерживать)
{
для (i = 2; i <= n; i ++)
{
держать = A [j = i]
в то время как (A [j-1]> держать)
{j--; A [j + 1] = A [j]}
A [j] = удерживать
}
# sentinel A [0] = "" будет создан при необходимости
}
СОВМЕСТИМОСТЬ ВОПРОСЫ
Определение языка AWK в Posix 1003.2 (проект 11.3) - это AWK, как описано в AWK.
книга с несколькими расширениями, появившимися в SystemVR4 nawk. Расширения:
Новые функции: toupper () и tolower ().
Новые переменные: ENVIRON [] и CONVFMT.
Спецификации преобразования ANSI C для printf () и sprintf ().
Новые параметры команды: -v var = value, несколько параметров -f и параметры реализации
в качестве аргументов -W.
Posix AWK ориентирован на построчную обработку файлов. RS можно изменить с "\ n"
к другому одиночному персонажу, но использовать для этого трудно - нет
примеры в книге AWK. Условно, RS = "", разделяет одну или несколько пустых строк
записи, позволяющие делать многострочные записи. Когда RS = "", "\ n" всегда является разделителем полей
независимо от значения в FS.
Mawk, с другой стороны, позволяет RS быть регулярным выражением. Когда "\ n" появляется в
записей, это рассматривается как пространство, и FS всегда определяет поля.
Парадигма удаления построчно может упростить некоторые программы и часто может улучшить
представление. Например, повторяя пример 3 сверху,
НАЧАТЬ {RS = "[^ A-Za-z] +"}
{слово [$ 0] = ""}
КОНЕЦ {удалить слово [""]
для (я в слове) cnt ++
печать cnt
}
подсчитывает количество уникальных слов, делая каждое слово записью. В файлах среднего размера
Mawk выполняется в два раза быстрее из-за упрощенного внутреннего цикла.
Следующая программа заменяет каждый комментарий одним пробелом в файле программы C,
НАЧАТЬ {
RS = "/ \ * ([^ *] | \ * + [^ / *]) * \ * + /»
# комментарий - разделитель записей
ORS = ""
Getline Hold
}
{задержка печати; hold = $ 0}
КОНЕЦ {printf "% s", удерживать}
Буферизация одной записи необходима во избежание завершения последней записи пробелом.
Доступно Mawk, все следующие эквивалентны:
x ~ / a \ + b / x ~ "a \ + b" x ~ "a \\ + b"
Строки сканируются дважды: один раз как строка и один раз как регулярное выражение. На
строковое сканирование, Mawk игнорирует escape-символы, не являющиеся escape-символами, в то время как книга AWK защищает
\c быть признанным c что требует двойного экранирования метасимволов в
струны. Posix явно отказывается определять поведение, которое пассивно заставляет программы
который должен работать под разными awks, чтобы использовать более переносимый, но менее читаемый, двойной
побег.
Posix AWK не распознает шестнадцатеричные escape-последовательности "/ dev / std {out, err}" или \ x в строках.
В отличие от ANSI C, Mawk ограничивает количество цифр, следующих за \ x, до двух в качестве текущего
реализация поддерживает только 8-битные символы. Встроенный смывать впервые появился в
недавно (1993) AT&T выпустила awk для netlib и не является частью стандарта posix.
Агрегатное удаление с удалять массив не является частью стандарта posix.
Posix явно оставляет поведение FS = "" undefined, и упоминает разделение
запись в символы как возможная интерпретация, но в настоящее время это использование не
переносимый между реализациями.
Наконец, вот как Mawk обрабатывает исключительные случаи, не обсуждаемые в книге AWK или
Проект Posix. Небезопасно предполагать согласованность между awks и безопасно переходить к следующему
.
substr (s, i, n) возвращает символы s в пересечении закрытых
interval [1, length (s)] и полуоткрытый интервал [i, i + n). Когда это
пересечение пусто, возвращается пустая строка; поэтому substr ("ABC", 1, 0) = ""
и substr ("ABC", -4, 6) = "A".
Каждая строка, включая пустую, соответствует пустой строке впереди, поэтому
s ~ // и s ~ "" всегда равны 1, как match (s, //) и match (s, ""). Последние два
набор ДЛИНА в 0.
index (s, t) всегда совпадает с match (s, t1), где t1 совпадает с t с
метасимволы ускользнули. Следовательно, согласованность с соответствием требует, чтобы индекс (s, "")
всегда возвращает 1. Также условие index (s, t)! = 0, если и только t является подстрокой
of s, требуется index ("", "") = 1.
Если getline встречает конец файла, getline var оставляет var неизменным. Сходным образом,
при входе в END действия, $0, поля и NF имеют неизменную ценность
последняя запись.
Используйте mawk онлайн с помощью сервисов onworks.net