• このエントリーをはてなブックマークに追加

awkの便利な文字列操作関数の使い方

  • このエントリーをはてなブックマークに追加

awk2
zaco muraです。

これまで何度も書いてきたawkですが、文字列を操作(切り取ったり置換したり)するための関数がたくさん用意されています。

いつも細かい文法を忘れがちなのでメモしておきたいと思います。

スポンサーリンク
Sponsords Link

目次

・文字列を置換する(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

以上となります。

これはシェルスクリプトを書く時になかなか役に立ちますので、ぜひお試しを。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link