ウェブサイト検索

Awk でフロー制御ステートメントを使用する方法 - パート 12


Awk シリーズの最初からこれまで取り上げてきたすべての Awk の例を確認すると、さまざまな例のすべてのコマンドが順番に、つまり次々に実行されていることがわかります。ただし、特定の状況では、いくつかの条件に基づいてテキスト フィルタリング操作を実行する必要がある場合があります。そこで、フロー制御ステートメントのアプローチが有効になります。

Awk プログラミングにはさまざまなフロー制御ステートメントがあり、次のようなものがあります。

  1. if-else ステートメント
  2. for ステートメント
  3. while ステートメント
  4. do-while ステートメント
  5. ブレークステートメント
  6. 継続ステートメント
  7. 次のステートメント
  8. nextfile ステートメント
  9. exit ステートメント

ただし、このシリーズの範囲として、if-elseforwhile、および do while ) について説明します。ステートメント。この Awk シリーズのパート 6 で next ステートメントの使用方法をすでに説明したことを思い出してください。

1. if-else ステートメント

if ステートメント の予期される構文は、シェルの if ステートメント の構文と似ています。

if  (condition1) {
     actions1
}
else {
      actions2
}

上記の構文では、condition1condition2 は Awk 式で、actions1actions2 は、それぞれの条件を満たしていること。

条件 1 が満たされると、つまり true になると、アクション 1 が実行され、if ステートメント が終了します。それ以外の場合は、アクション 2 が実行されます。実行されました。

if ステートメントは、次のように if-else_if-else ステートメントに拡張することもできます。

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

上記のフォームでは、条件 1 が true の場合は アクション 1 が実行され、if ステートメントが終了します。それ以外の場合は 条件 2 が実行されます。が評価され、true の場合はアクション2が実行され、if ステートメントが終了します。ただし、条件 2 が false の場合、アクション 3 が実行され、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 ステートメントは、以下の構文を使用してそれを実行するための適切な方法を提供します。

ここでのアプローチは、カウンターを使用してループの実行を制御することによって単純に定義されています。まずカウンターを初期化する必要があります。次に、テスト条件に対して実行し、それが true の場合はアクションを実行し、最後にカウンターをインクリメントします。カウンタが条件を満たさない場合、ループは終了します。

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

次の Awk コマンドは、0 ~ 10 の数値を出力するfor ステートメントがどのように機能するかを示しています。

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 式であり、アクションは条件が true のときに実行される 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 ステートメントの例を使用すると、test.sh スクリプトの Awk コマンドを次のように変更することで、do while の使用方法を説明できます。以下に続きます:

#!/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 スクリプトの作成に移ります。