awkのsubstr()で文字列の切り出し位置が文字数で特定できない場合には、index()関数と組み合わせると便利です。

スポンサーリンク

index()関数の使い方

※awkの使い方をまとめて一覧にしました。
参考:awk入門-使い方まとめ一覧-

下記の形式でindex()を書きます。

対象文字列を先頭から検索し、検索文字列が検出された最初の位置を戻り値として返します。

index(対象文字列, 検索文字列)

例えば、1フィールド(列)目の文字列を先頭から検索して、"0"の文字列の検出位置を特定したい場合は下記のように書きます。

index( $1, "0" )

substr()とindex()を組み合わせる方法をよく使います。

下記にサンプルコードも合わせてご紹介したいと思います。

スポンサーリンク

substr()とindex()を組み合わせる方法

更に、"0"の文字列を検出した最初の位置から3文字分だけ切り出したい場合は、下記のように書くことができます。

		num = substr( $1, index( $1, "0" ), 3)

サンプルコード

サンプルコードになります。
in.txtの中身は下記のようだったとして、1フィールド(列)目の番号のみを切り出したいとします。
ここでは、1フィールド(列)目の番号の周りには、不必要な文字列があると仮定しています。

 $ cat in.txt 
id001= 雨
ddidid002= 曇り
idid003== 晴れ

in.txtに下記の前提条件があるとすれば
1.番号の先頭が必ず"0"から開始される
2.番号は三桁
下記のように、"0"の文字列を検出した最初の位置から3文字分だけ切り出せば良いことになります。

 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	{
		num = substr( $1, index( $1, "0" ), 3)
		print num , $2
	}
'

実行すると、下記のように番号のみ切り出されます。
 $ ./sample.awk 
001 雨
002 曇り
003 晴れ

スポンサーリンク