$ cat doubleawk 'FILENAME != prevfile { # new file NR = 1 # reset line number prevfile = FILENAME}NF > 0 { if ($1 == lastword) printf "double %s, file %s, line %d\n" ,$1, FILENAME, NR for (i = 2; i <= NF; i++) if ($i == $(i-1)) printf "double %s, file %s, line %d\n", $i, FILENAME, NR if (NF > 0) lastword = $NF}' $**$Операция
++--Встроенная переменная
FILENAMENRОператор
ifif (условие) оператор1else оператор2Если условие верно, то выполняется
оператор1оператор2Цикл
forshellfor (выражение1; условие; выражение2) операторЦикл
forawkВыражение1 while (условие) { оператор выражение2}Например, конструкция
for (i=2; i <= NF; i++)является циклом с
iNFОператор
breakwhileforcontinuewhileвыражению2fornextawkexitENDКак и в большинстве языков программирования, в
awkawk$ cat backwards# backwards: print input in backward line orderawk ' { line[NR] = $0 }END { for (i = NR; i > 0; i--) print line[i] } ' $*$Заметьте, что подобно переменным, массивы не нужно описывать; размер массива ограничен только объемом памяти, доступным на вашей машине. Конечно, если очень большой файл заносится в массив, в конце концов, это может привести к исчерпанию ресурсов памяти. Для печати конца большого файла в обратном порядке следует обратиться за помощью к команде
tail$ tail -5 /usr/dict/web2 | backwardszymurgyzymoticallyzymoticzymostheniczymosis$Команда
taillseektail-rbackwardsПри обычной обработке входная строка разбивается на поля. Эту операцию можно выполнить с помощью встроенной функции
splitn = split(s, arr, sep)Строка
sarrnsepFSsplit($0, а, ":")/etc/passwdsplit("9/29/83", date, "/")$ sed 1q /etc/passwd | awk '{split($0, a, ":"); print a[1]}'root$ echo 9/29/83 | awk '{split($0, date, "/"); print date[3]}'83$В табл. 4.5 перечислены встроенные функции
awkcos(expr) | Косинус expr |
exp(expr) | Возведение в степень expr |
getline() | Чтение следующей входной строки; возвращает 0 в случае конца файла, в противном случае 1 |
index(s1, s2) | Положение строки s2s1 |
int(expr) | Целая часть expr |
length(s) | Длина строки s |
log(expr) | Натуральный логарифм expr |
sin(expr) | Синус expr |
split(s, a, c) | Разбиение sа[1]a[n]cn |
sprintf(fmt, ...) | Форматирование в соответствии со спецификацией fmt |
substr(s,m,n) | Подстрока в nsm |