これまで何度も書いてきたawkですが、文字列を操作(切り取ったり置換したり)するための関数がたくさん用意されています。
いつも細かい文法を忘れがちなのでメモしておきたいと思います。
Contents
目次
・文字列を置換する(gsub)
・大文字、小文字を変換(tolower,toupper)
・先頭から切り出す(substr)
・末尾から切り出す(substr+length)
・指定した文字から切り出す(substr+index)
文字列を置換する(gsub)
まず定番の文字列の置換です。これにはgsub関数を使います。
文法は以下のとおりです。
gsub(“置換元”,”置換後”,対象の文字列)
使用例は以下のとおりです。
# echo "abcde" | awk '{gsub("a","A",$0);print $0}' Abcde
上の例では、小文字”a” を 大文字”A” に置換しています。
また、gsubは文字列を破壊的に(元の文字列を残さないように)変更します。
ですので置換結果を表示したい場合には、例のように print などで表示します。
小文字、大文字の変換(tolower,toupper)
先ほどはgsubを使って大文字、小文字を変換しましたが、それ専用の関数もあります。
それが、tolower関数とtoupper関数です。
文法は以下のとおりです。
小文字 -> 大文字 : toupper(文字列)
大文字 -> 小文字 : tolower(文字列)
使用例は以下のとおりです。
# echo "aBcDe" | awk '{print tolower($0)}' abcde # echo "aBcDe" | awk '{print toupper($0)}' ABCDE
先頭から切り出す(substr)
次は文字列の切り出しです。これにはsubstr関数を使います。
文法は以下のとおりです。
substr(文字列,開始文字数(先頭から起算),切り出す文字数)
先程のgsubとは引数の順番が違うのが紛らわしいですね。
使用例は以下のとおりです。
### 0文字目から1文字切り出す # echo "123456" | awk '{print substr($0,0,1)}' 1 ### 3文字目から2文字切り出す # echo "123456" | awk '{print substr($0,3,2)}' 34 ### 2文字目から文字列の最後まで切り出す # echo "123456" | awk '{print substr($0,2,length($0))}' 23456
末尾から切り出す(substr+length)
次は文字列の切り出しです。これはsubstr関数と、length関数を使います。
文法は以下のとおりです。
length(文字列)
この関数では、文字列の文字数を返してくれます。
実際に使ってみましょう。
### 末尾2文字目から1文字切り出す # echo "123456" | awk '{print substr($0,(length($0)+1)-2,1)}' 1 ### 末尾3文字目から3文字切り出す # echo "123456" | awk '{print substr($0,(length($0)+1)-3,3)}' 456
ちょっとわかりづらいですが、
(length($0)+1)-2 の部分を解説しますと
・length関数で末尾の位置を取得(ここでは”123456″なので、6文字)
・substrは0から起算するので、length関数に合わせるために+1してあげる
・指定したい文字数(ここでは2)
として切り出しを開始する位置を特定しています。
指定した文字から切り出す(substr+index)
最後に、指定した文字から開始して切り出す方法です。
これはsubstr関数と、index関数を使います。
文法は以下のとおりです。
index(文字列,”検索文字”)
実際に使ってみると
# echo "abcde" | awk '{print index($0,"a")}' 1 # echo "abcde" | awk '{print index($0,"b")}' 2
このように、検索文字の位置を返してくれます。
これを利用して特定文字から切り出しができます。
### "b" から 2文字切り出し # echo "abcde" | awk '{print substr($0,index($0,"b"),2)}' bc ### "c" から最後まで切り出し echo "abcde" | awk '{print substr($0,index($0,"c"),length($0))}' cde
以上となります。
これはシェルスクリプトを書く時になかなか役に立ちますので、ぜひお試しを。