Awk-miscellaneous-functions

提供:Dev Guides
移動先:案内検索

AWK-その他の関数

AWKには、次のその他の機能があります-

close(expr)

この関数は、パイプのファイルを閉じます。

[jerry]$ awk 'BEGIN {
   cmd = "tr [a-z] [A-Z]"
   print "hello, world !!!" |& cmd

   close(cmd, "to")
   cmd |& getline out
   print out;

   close(cmd);
}'

このコードを実行すると、次の結果が得られます-

出力

HELLO, WORLD !!!

スクリプトは不可解に見えますか? それを分かりやすく説明しましょう。

  • 最初のステートメント cmd = "tr [a-z] [A-Z]" -AWKからの双方向通信を確立するコマンドです。
  • 次のステートメント、つまり print コマンドは、trコマンドへの入力を提供します。 ここで、*&| *は双方向通信を示します。
  • 3番目のステートメント、つまり* close(cmd、 "to")は、実行の競合後に *to プロセスを閉じます。
  • 次のステートメント cmd |&getline out は、getline関数を使用して出力を out 変数に保存します。
  • 次のprintステートメントは出力を印刷し、最後にclose関数がコマンドを閉じます。

削除する

この関数は、配列から要素を削除します。 次の例は、*削除*関数の使用法を示しています-

[jerry]$ awk 'BEGIN {
   arr[0] = "One"
   arr[1] = "Two"
   arr[2] = "Three"
   arr[3] = "Four"
   print "Array elements before delete operation:"

   for (i in arr) {
      print arr[i]
   }
   delete arr[0]
   delete arr[1]
   print "Array elements after delete operation:"

   for (i in arr) {
      print arr[i]
   }
}'

このコードを実行すると、次の結果が得られます-

出力

Array elements before delete operation:
One
Two
Three
Four

Array elements after delete operation:
Three
Four

exit

この関数は、スクリプトの実行を停止します。 また、AWKの戻り値になるオプションの expr も受け入れます。 次の例は、出口関数の使用法を説明しています。

[jerry]$ awk 'BEGIN {
   print "Hello, World !!!"
   exit 10
   print "AWK never executes this statement."
}'

このコードを実行すると、次の結果が得られます-

出力

Hello, World !!!

フラッシュ

この関数は、開いている出力ファイルまたはパイプに関連付けられているバッファをフラッシュします。 次の構文は、関数を示しています。

構文

fflush([output-expr])

output-exprが指定されていない場合、標準出力をフラッシュします。 output-exprがヌル文字列( "")の場合、開いているすべてのファイルとパイプをフラッシュします。

getline

この関数は、AWKに次の行を読み取るように指示します。 次の例では、getline関数を使用して marks.txt ファイルを読み取って表示します。

[jerry]$ awk '{getline; print $0}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

2) Rahul   Maths     90
4) Kedar   English   85
5) Hari    History   89

スクリプトは正常に動作します。 しかし、最初の行はどこですか? 調べてみましょう。

開始時に、AWKはファイル marks.txt から最初の行を読み取り、それを $ 0 変数に保存します。

そして最後に、AWKの print ステートメントは2行目を出力します。 このプロセスは、ファイルの最後まで続きます。

next

*next* 関数は、プログラムのフローを変更します。 これにより、パターンスペースの現在の処理が停止します。 プログラムは次の行を読み取り、新しい行からコマンドの実行を再開します。 たとえば、次のプログラムは、パターンマッチが成功した場合、処理を実行しません。

[jerry]$ awk '{if ($0 ~/Shyam/) next; print $0}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

1) Amit    Physics   80
2) Rahul   Maths     90
4) Kedar   English   85
5) Hari    History   89

nextfile

*nextfile* 関数は、プログラムのフローを変更します。 現在の入力ファイルの処理を停止し、次のファイルの最初のレコードから開始して、パターン/プロシージャステートメントの新しいサイクルを開始します。 たとえば、次の例では、パターンマッチが成功すると最初のファイルの処理を停止します。

最初に2つのファイルを作成します。 file1.txt が含まれているとしましょう-

file1:str1
file1:str2
file1:str3
file1:str4

そして file2.txt に含まれるもの-

file2:str1
file2:str2
file2:str3
file2:str4

次に、nextfile関数を使用してみましょう。

[jerry]$ awk '{ if ($0 ~/file1:str2/) nextfile; print $0 }' file1.txt file2.txt

出力

このコードを実行すると、次の結果が得られます-

file1:str1
file2:str1
file2:str2
file2:str3
file2:str4

戻る

この関数は、値を返すユーザー定義関数内で使用できます。 exprが提供されない場合、関数の戻り値は未定義であることに注意してください。 次の例は、return関数の使用法を説明しています。

まず、以下に示すようにAWKコマンドを含む functions.awk ファイルを作成します-

function addition(num1, num2) {
   result = num1 + num2
   return result
}
BEGIN {
   res = addition(10, 20)
   print "10 + 20 = " res
}

このコードを実行すると、次の結果が得られます-

出力

10 + 20 = 30

システム

この関数は、指定されたコマンドを実行し、その終了ステータスを返します。 戻りステータス0は、コマンドの実行が成功したことを示します。 ゼロ以外の値は、コマンド実行の失敗を示します。 たとえば、次の例は現在の日付を表示し、コマンドの戻りステータスも表示します。

[jerry]$ awk 'BEGIN { ret = system("date"); print "Return value = " ret }'

このコードを実行すると、次の結果が得られます-

出力

Sun Dec 21 23:16:07 IST 2014
Return value = 0