Операционные системы - статьи

         

Структурные операторы


if (условие) {операторы} [else {операторы}]

while (условие) {операторы}

for (выражение; условие; выражение) {операторы}

for (индекс in имя_массива) {операторы}

Структурные операторы в значительной степени аналогичны

соответствующим операторам Си. В последнем случае для каждого

индекса выполняется блок. Текстовые индексы рассматриваются в

лексикографическом порядке.

Примеры

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 И.Х. Хведоров

Здесь, кроме изменения очередности полей в строке

на противоположное (что делает цикл "for"), предварительно

устанавливается выходной разделитель - пробел и весь результат

предварительно выдается в одну строку, поэтому после обработки

каждой строки выдается команда "print RS" для перевода

выходной строки. Редактор "sed" подключен через конвейер,

чтобы убрать возможные пробелы в начале строки. Существенная деталь.

Если запустить лишь базовую структуру

awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk

то все поля исходной таблицы с изменениями порядка

внутри прежних строк получим вытянутыми в один столбец переводом

строки:

50

1980

И.И.

Иванов

40

1979

А.В.

Петров

40

1979

С.К.

Сидоров

60

1970

И.Х.

Хведоров

Однако, если поставим ";" сразу после условия,

т.е. сделаем пустое тело цикла, за пределы которого вынесен "print

$k"

awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk

то получим исходную таблицу

Иванов И.И. 1980 50

Петров А.В. 1979 40

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60

поскольку "$k" после выхода из цикла будет

иметь значение "0", а "$0" - соответсвует

всей строке в качестве значения(!), то "print $k" будет

после каждого цикла печатать полные строки.



Содержание раздела