それではAWK練習問題、第3回目
今回は文字列操作を行う関数を使って、正規表現にマッチした行を出力するとか、文字列の一部を切り取ったり、置換したりした結果を出力する
文字列操作関数
AWKで用意されている文字列操作関数を紹介する
substr
説明 | 文字列を抜き出す |
第1引数 | 対象フィールド |
第2引数 | 抜き出し開始位置(0が最初) |
第3引数 | 抜き出す文字列の長さ |
下の例では$0(1行まるごと)に対して、3文字目(0,1,2なので)から4文字抜き出したので
wkstと出力される
1 2 |
$ echo 'AwkStudy' | awk '{print substr($0, 2, 4)}' wkSt |
特定のフィールドに対して適用したい場合
1 2 |
$ echo 'Awk Study' | awk '{print $1,substr($2, 2, 4)}' Awk tudy |
match
説明 | 行が正規表現にマッチするかどうかを返す |
第1引数 | 対象フィールド |
第2引数 | 正規表現 |
行を読み取って、正規表現にマッチしたら正の真偽値を返す
sample.tsv
1 2 3 4 5 6 7 |
数学 50 C 田中一郎 国語 80 B 田中二郎 英語 90 A 田中三郎 社会 100 S 田中四郎 理科 60 C 田中六郎 美術 30 D 田中七郎 体育 60 C 田中八郎 |
第4列目に「一」、「二」が含まれる場合に行を出力してみる
1 2 3 |
$ cat sample.tsv | awk 'match($4, /一|二/) {print $0}' 数学 50 C 田中一郎 国語 80 B 田中二郎 |
sub
説明 | 文字列を置換する |
第1引数 | マッチ部分(正規表現) |
第2引数 | 置換する文字列 |
第3引数 | 置換するフィールド( 省略時:$0 |
2列目を"AAA"に置換してみる
1 2 |
$ echo "aaa bbb ccc" | awk '{sub(/.+/, "AAA", $2); print $0}' aaa AAA ccc |
gsub
説明 | マッチした文字列を全置換 |
第1引数 | マッチ部分(正規表現) |
第2引数 | 置換する文字列 |
第3引数 | 置換するフィールド(省略時:$0 |
1列目をまるごと"AAA"に置換してみる
1 2 |
$ echo "aaa bbb ccc" | awk '{gsub(/./, "A", $1); print $0}' AAA bbb ccc |
それでは、問題に行ってみましょー
問題
sample.tsv
1 2 3 |
111-2222 Black-Smith 000,1111,2222 222-3333 Gold-Smith 111,2222,3333 333-4444 Shiro-Smith 222,3333,4444 |
- 各行の1列目を先頭から3文字抜き出して出力してください
- 2列目がGoldから始まる行を出力してください
- 2列目がShiroから始まる行を3列目を「,」(カンマ)を「-」(ハイフン)に変換して出力してください
それでは解答です
解答
各行の1列目を先頭から3文字抜き出して出力してください
1 2 3 4 |
$ cat sample.tsv | awk '{print substr($1,0,3)}' 111 222 333 |
2列目がGoldから始まる行を出力してください
1 2 |
$ cat sample.tsv | awk 'match($2, /Gold/) {print $0}' 222-3333 Gold-Smith 111,2222,3333 |
2列目がShiroから始まる行を3列目を「,」(カンマ)を「-」(ハイフン)に変換して出力してください
1 2 |
$ cat sample.tsv | awk 'match($2, /Shiro/) {gsub(/,/, "-", $3); print $0}' 333-4444 Shiro-Smith 222-3333-4444 |
matchとgsubを組み合わせましょう
まとめ
- AWKでは文字列操作関数がある
- substrでは文字列の切り抜きができる
- matchでは行が正規表現にマッチしてるかを判定する
- sub, gsubではマッチした正規表現を指定文字列に置換する
「シェル芸」に効く!AWK処方箋
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!