Awk-miscellaneous-functions
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