Академический Документы
Профессиональный Документы
Культура Документы
1. СТРУКТУРА awk-ПРОГРАММЫ
Частные случаи:
Результат:
Иванов И.И. 1980 50
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
Привет!
Привет!
BEGIN {действие}
шаблон {действие}
шаблон {действие}
. . .
END {действие}
2. ВЫЗОВ awk
1)
awk [-Fc] 'prog.awk' [files]
и
awk '/до/ {print}' < f-awk
2)
awk [-Fc] -f prog.awk [files]
3. awk-ПЕРЕМЕННЫЕ И ВЫРАЖЕНИЯ
Примеры:
awk '{a = $3 $4; print a}' f-awk
awk '{a = $3+$4; print a}' f-awk
Результат:
198050
197940
197940
197060
2030
2019
2019
2030
awk '{}
END {a = 2 + 2 ; print a}' < f-awk
awk '{}
END {a = 2 + "2" ; print a}' < f-awk
awk '{}
END {a = 2 + "два" ; print a}' < f-awk
awk '{}
END {a = "два"+"два" ; print a}' < f-awk
awk '{}
END {a = 2.2 + 2.000 ; print a}' < f-awk
Результат:
4
4
2
0
4.2
Логические операции:
!, ||, &&
4. ПРИМЕРЫ awk-ПРОГРАММ
1)
awk '{print ($2, $3)}' f-awk
Результат:
И.И. 1980
А.В. 1979
С.К. 1979
И.Х. 1970
2)
awk '/е/ {print ($2, $3)}' f-awk
Результат:
А.В. 1979
И.Х. 1970
3)
awk '/е/ {print ($1, 2000 - $3)}' f-awk
Результат:
Петров 21
Хведоров 30
4)
awk '{ s = s + $4}
END {print ("Суммарный возраст:" s)
print ("Средний возраст:" s/NR)}' f-awk
Результат:
Суммарный возраст:190
Средний возраст:47.5
5)
awk '{ s += $4 }
{print("NR="NR, "NF="NF)}
END {print ("FILENAME=" FILENAME)
print ("Значение позиционной переменной" $4 "\"пусто\" \
после окончания просмотра)")
print ("Суммарный возраст:" s)
print ("Средний возраст:" s/NR)}' f-awk
Результат:
NR=1 NF=4
NR=2 NF=4
NR=3 NF=4
NR=4 NF=4
FILENAME=f-awk
5. СЕЛЕКТОРЫ
Соответсвующие примеры:
1)
$3 != $4 && $3 > 1970
$3 % 2 == 1
$1=="Иванов" - кавычки, чтобы воспринималось, как строка.
2)
/ab/ отлично от /a b/, / ab/ и /ab /
Nполя ^шаблон - по совпадению
Nполя !^шаблон - по несовпадению
Пример:
awk '$3~0 {print} ' < f-awk
echo
awk '$3!~0 {print} ' < f-awk
Примеры сочетаний:
awk ' $3~/(7[0-9])$/ {print} ' f-awk
Результат:
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
6. ЕЩЕ ПРИМЕРЫ
1)
awk '$1=="Иванов" {print} ' f-awk
Результат:
Иванов И.И. 1980 50
2)
awk '$4/2==30 {print} ' f-awk
Результат:
Хведоров И.Х. 1970 60
3)
awk '$3 != $4 && $3 > 1970 {print} ' f-awk
Результат:
Иванов И.И. 1980 50
Петров А.В. 1979 40
Сидоров С.К. 1979 40
4)
awk '$1~/нов$/ {print} ' f-awk
Результат:
Иванов И.И. 1980 50
5)
awk '/^Ив|дор/ {print} ' f-awk
Результат:
Иванов И.И. 1980 50
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
6)
awk '/1980/,/1979/ {print} ' f-awk
Результат:
Иванов И.И. 1980 50
Петров А.В. 1979 40
7. ДЕЙСТВИЯ
ОПЕРАТОРЫ УПРАВЛЕНИЯ
Простейшие операторы
Структурные операторы
Примеры
1)
awk ' $4~/40/ {if($3<=1980) {print("Фамилия: " $1 ) M["40"]++}}
$4~/50/ {M["50"]++}
END {for(i in M) {print(" i =" i " M[" i "]=" M[i])}} ' f-awk
Результат:
Фамилия: Петров
Фамилия: Сидоров
i =40 M[40]=2
i =50 M[50]=1
2)
awk ' BEGIN {ORS = " "}
{ for(k=NF; k>0; --k) {print $k}
{print RS}
} ' f-awk |
sed 's/^ //'
Результат:
50 1980 И.И. Иванов
40 1979 А.В. Петров
40 1979 С.К. Сидоров
60 1970 И.Х. Хведоров
Результат:
фамилия: Сидоров
годы: 60
Результат:
фамилия: Иванов
фамилия: Петров
фамилия: Сидоров
фамилия: Хведоров
9. ВСТРОЕННЫЕ ФУНКЦИИ
Встроенные функции:
sin (expr) синус expr
cos (expr) косинус expr
exp (expr) возведение в степень expr
log (expr) натуральный логорифм expr
sqrt (expr) извлечение корня expr
int (expr) целая часть числа
length (s) длина строки s
printf (fmt, ...) форматирование (аналогично Си) по спецификации
fmt.
substr (s, m, n) подстрока в n символов строки s, начинающаяся с
m.
getline () чтение следующей строки. 0 - конец файла, иначе
1.
index (s1, s2) номер позиции, с которой s1 совпадает с s2,
иначе 0.
split (s, M, c) строка s разбивается элементы массива M по
разделителю c (по умолчанию FS=" "); функция возвращает число
полей.
Примеры.
1)
awk ' BEGIN {FS = "."; a=0}
length ($1) > 8 {print (length ($1), $0);
a++
}
END {print ("Найдено строк: " a) }' f-awk
Результат:
9 Сидоров С.К. 1979 40
10 Хведоров И.Х. 1970 60
Найдено строк: 2
2)
awk '{i=split($0, Name, ".");
for (j=1; j<=i; j++)
print ("Name[" j "]=" Name[j])
}' f-awk
Результат:
Name[1]=Иванов И
Name[2]=И
Name[3]= 1980 50
Name[1]=Петров А
Name[2]=В
Name[3]= 1979 40
Name[1]=Сидоров С
Name[2]=К
Name[3]= 1979 40
Name[1]=Хведоров И
Name[2]=Х
Name[3]= 1970 60
3)
awk '{print (length)}' f-awk
Результат:
22
22
22
22
4)
awk '{printf "%7.2f %s\n", NR, $0}' f-awk
echo
awk '{printf "\t%s %s \n", NR, $0}' f-awk
Результат:
1.00 Иванов И.И. 1980 50
2.00 Петров А.В. 1979 40
3.00 Сидоров С.К. 1979 40
4.00 Хведоров И.Х. 1970 60