やりたいこと
文字列があった時に検索ワードを指定して切り出したい。
具体的な例として以下の文字列があった際に
abcdefghijklmn
検索ワード「e」にて
前半部分
abcd
後半部分
fghijklmn
を出力させる。
ワンライナー
検索文字列の前半を切り出す
awk '{print substr($0,0,index($0,"検索文字列"))}'
$ echo abcdefghijklmn | awk '{print substr($0,0,index($0,"e"))}' abcd
検索文字列の後半を切り出す
awk '{print substr($0,index($0,"検索文字列")+length("検索文字列"))}'
$ echo abcdefghijklmn | awk '{print substr($0,index($0,"e")+1)}' fghijklmn
以下、補足です。
補足
awkに実装されているsubstr
関数を利用します。
substr(s,i,n) substr(s,i)
Returns the substring of string s, starting at index i, of length n. If n is omitted, the suffix of s, starting at i is returned.
第一引数は文字列、第二引数はスタートする位置、第三引数は文字列の長さです。第三引数は省略可能です。
スタートする位置は3番目で表示させたり
$ echo abcdefghijklmn | awk '{print substr($0,3)}' cdefghijklmn
スタートする位置は3番目で長さを5で表示させたりできます
$ echo abcdefghijklmn | awk '{print substr($0,3,5)}' cdefg
あとはここに検索文字列を検索するためにindex
を利用します。
index(s,t)
If t is a substring of s, then the position where t starts is returned, else 0 is returned. The first character of s is in position 1.
第一引数に文字列、第二引数に検索するワードの位置を返します。
これを使えば"e"で検索をかけてsubstrの第三引数にすれば前半が取り出せそうです。
$ echo abcdefghijklmn | awk '{print substr($0,1,index($0,"e"))}' abcde
ただ、今回は「e」部分が不要なので開始位置を「1」ではなく「0」にするトリッキーな手法をとります。
$ echo abcdefghijklmn | awk '{print substr($0,0,index($0,"e"))}' abcd
これは検索文字列の長さに依存せず利用できます。
$ echo abcdefghijklmn | awk '{print substr($0,0,index($0,"ef"))}' abcd
次は後半部分ですが、こちらはindexで取得した位置を開始位置に利用します。
$ echo abcdefghijklmn | awk '{print substr($0,index($0,"e"))}' efghijklmn
今回は「e」部分が不要なので開始位置を1つずらします。
$ echo abcdefghijklmn | awk '{print substr($0,index($0,"ef")+1)}' fghijklmn
ただ今回は検索文字列が一文字だったのですが、これが二文字以上であればその分ずらす必要があるので、より汎用的には以下となります。
$ echo abcdefghijklmn | awk '{print substr($0,index($0,"ef")+length("ef"))}' ghijklmn
length
関数で文字列の長さを取得しています。
終わりに
単純な文字列の抽出によく使う手法なので、備忘録として整理しました。
ご参考になれば幸いです。