awkで組み込み関数のgensubを使って指定した列や変数の値だけを置換する
Pocket

awkで置換するといえば組み込み関数のsub関数やgsub関数だが、これらはawk内で代入した変数の置換をするような使い方ができない($0で受けた内容すべてに対しての置換はできる)。
定義した変数や特定の列に対してのみ置換をする場合は、gensub関数を利用するとよいだろう。

gensub("置換前","置換後",置換位置(NUM)[,置換対象文字列(列や変数名など)])
Sponsored Links

実際に利用する場合については、以下の例を参考にするとよいだろう。

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
aaa="1" bbb="2" ccc="3" ddd="4"
aaa="11" bbb="21" ccc="31" ddd="41"
aaa="12" bbb="22" ccc="32" bbb="3rqt" ddd="42"
aaa="13" bbb="23" ccc="33" ddd="43"
aaa="14" bbb="24" ccc="34" ddd="44"
aaa="15" bbb="25" ccc="35" ddd="45"
aaa="16" bbb="26" ccc="36" ddd="46"
aaa="17" bbb="27" ccc="37" ddd="47"
aaa="18" bbb="28" ccc="38" ddd="48"
[root@BS-PUB-CENT7-01 ~]# # 列を指定せずにaaaをhhhに置換する
[root@BS-PUB-CENT7-01 ~]# awk '{print gensub("aaa","hhh",1)}' /tmp/test.txt
hhh="1" bbb="2" ccc="3" ddd="4"
hhh="11" bbb="21" ccc="31" ddd="41"
hhh="12" bbb="22" ccc="32" bbb="3rqt" ddd="42"
hhh="13" bbb="23" ccc="33" ddd="43"
hhh="14" bbb="24" ccc="34" ddd="44"
hhh="15" bbb="25" ccc="35" ddd="45"
hhh="16" bbb="26" ccc="36" ddd="46"
hhh="17" bbb="27" ccc="37" ddd="47"
hhh="18" bbb="28" ccc="38" ddd="48"
[root@BS-PUB-CENT7-01 ~]# # 列を指定(1列目)してaaaをhhhに置換する
[root@BS-PUB-CENT7-01 ~]# awk '{print gensub("aaa","hhh",1,$1)}' /tmp/test.txt
hhh="1"
hhh="11"
hhh="12"
hhh="13"
hhh="14"
hhh="15"
hhh="16"
hhh="17"
hhh="18"
[root@BS-PUB-CENT7-01 ~]# # 1つ目にヒットしたaをhに置換する
[root@BS-PUB-CENT7-01 ~]# awk '{print gensub("a","h",1,$1)}' /tmp/test.txt
haa="1"
haa="11"
haa="12"
haa="13"
haa="14"
haa="15"
haa="16"
haa="17"
haa="18"
[root@BS-PUB-CENT7-01 ~]# # 2つ目にヒットしたaをhに置換する
[root@BS-PUB-CENT7-01 ~]# awk '{print gensub("a","h",2,$1)}' /tmp/test.txt
aha="1"
aha="11"
aha="12"
aha="13"
aha="14"
aha="15"
aha="16"
aha="17"
aha="18"
Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。