Поиск по сайту:

Как использовать операторы управления потоком в Awk. Часть 12


Когда вы просмотрите все примеры Awk, которые мы рассмотрели до сих пор, с самого начала серии Awk, вы заметите, что все команды в различных примерах выполняются последовательно, то есть одна за другой. Но в определенных ситуациях нам может потребоваться выполнить некоторые операции фильтрации текста на основе некоторых условий, и именно здесь применяется подход операторов управления потоком.

В программировании на Awk существуют различные операторы управления потоком, в том числе:

  1. оператор if-else
  2. для заявления
  3. оператор while
  4. заявление «делать пока»
  5. оператор разрыва
  6. продолжить заявление
  7. следующее заявление
  8. оператор следующего файла
  9. заявление о выходе

Однако в рамках этой серии мы остановимся на следующих вопросах: if-else, for, while и do while операторы. Помните, что мы уже рассмотрели, как использовать оператор next в части 6 этой серии статей об Awk.

1. Оператор if-else

Ожидаемый синтаксис оператора if аналогичен синтаксису оператора if оболочки:

if  (condition1) {
     actions1
}
else {
      actions2
}

В приведенном выше синтаксисе condition1 и condition2 — это выражения Awk, а actions1 и actions2 — это команды Awk, выполняемые, когда соответствующие условия соблюдены.

Когда условие1 удовлетворено, то есть оно истинно, выполняется actions1 и завершается выполнение оператор if, в противном случае выполняется actions2. казнён.

Оператор if также можно расширить до оператора if-else_if-else, как показано ниже:

if (condition1){
     actions1
}
else if (conditions2){
      actions2
}
else{
     actions3
}

В приведенной выше форме, если условие1 истинно, то actions1 выполняется и оператор if завершается, в противном случае условие2 оценивается, и если оно истинно, то actions2 выполняется и оператор if завершается. Однако если condition2 ложно, actions3 выполняется и оператор if завершается.

Вот пример использования операторов if. У нас есть список пользователей и их возраст, хранящийся в файле users. .txt.

Мы хотим напечатать заявление, указывающее имя пользователя и возраст пользователя меньше или больше 25 лет.

aaronkilik@tecMint ~ $ cat users.txt
Sarah L			35    	F
Aaron Kili		40    	M
John  Doo		20    	M
Kili  Seth		49    	M    

Мы можем написать короткий сценарий оболочки для выполнения нашей работы, описанной выше. Вот содержимое сценария:


#!/bin/bash
awk ' { 
        if ( $3 <= 25 ){
           print "User",$1,$2,"is less than 25 years old." ;
        }
        else {
           print "User",$1,$2,"is more than 25 years old" ; 
}
}'    ~/users.txt

Затем сохраните файл и выйдите, сделайте скрипт исполняемым и запустите его следующим образом:

chmod +x test.sh
./test.sh
Пример вывода
User Sarah L is more than 25 years old
User Aaron Kili is more than 25 years old
User John Doo is less than 25 years old.
User Kili Seth is more than 25 years old

2. Оператор for

Если вы хотите выполнить некоторые команды Awk в цикле, то оператор for предлагает вам подходящий способ сделать это с помощью приведенного ниже синтаксиса:

Здесь подход просто определяется использованием счетчика для управления выполнением цикла: сначала вам нужно инициализировать счетчик, затем запустить его по тестовому условию, если оно истинно, выполнить действия и, наконец, увеличить счетчик. Цикл завершается, когда счетчик не удовлетворяет условию.

for ( counter-initialization; test-condition; counter-increment ){
      actions
}

Следующая команда Awk показывает, как работает оператор for, где мы хотим напечатать числа 0–10:

awk 'BEGIN{ for(counter=0;counter<=10;counter++){ print counter} }'
Пример вывода
0
1
2
3
4
5
6
7
8
9
10

3. Оператор while

Обычный синтаксис оператор while следующий:

while ( condition ) {
          actions
}

Условие — это выражение Awk, а действия — это строки команд Awk, выполняемые, когда условие истинно.

Ниже приведен сценарий, иллюстрирующий использование оператор while для печати чисел 0–10:

#!/bin/bash
awk ' BEGIN{ counter=0 ;
         
        while(counter<=10){
              print counter;
              counter+=1 ;
             
}
}  

Сохраните файл и сделайте скрипт исполняемым, затем запустите его:

chmod +x test.sh
./test.sh
Пример вывода
0
1
2
3
4
5
6
7
8
9
10

4. Оператор do while

Это модификация приведенного выше оператор while со следующим базовым синтаксисом:

do {
     actions
}
 while (condition) 

Небольшое отличие состоит в том, что в разделе do while команды Awk выполняются до оценки условия. Используя сам пример из оператор while выше, мы можем проиллюстрировать использование do while, изменив команду Awk в сценарии test.sh следующим образом: следует:

#!/bin/bash

awk ' BEGIN{ counter=0 ;  
        do{
            print counter;  
            counter+=1 ;    
        }
        while (counter<=10)   
} 
'

После изменения сценария сохраните файл и выйдите. Затем сделайте скрипт исполняемым и выполните его следующим образом:

chmod +x test.sh
./test.sh
Пример вывода
0
1
2
3
4
5
6
7
8
9
10

Заключение

Это не полное руководство по операторам управления потоком Awk, поскольку, как я уже упоминал ранее, в Awk есть несколько других операторов управления потоком.

Тем не менее, эта часть серии статей об Awk должна дать вам четкое фундаментальное представление о том, как можно контролировать выполнение команд Awk в зависимости от определенных условий.

Вы также можете подробнее рассказать об остальных операторах управления потоком, чтобы лучше понять предмет. Наконец, в следующем разделе серии статей об Awk мы перейдем к написанию сценариев Awk.