古い記事
ランダムジャンプ
新しい記事
辞書とマッチするカラムを別なものに置換するというよくやる作業について、簡単に試せるワンライナーとともにメモ。

cat sample.txt (TSV)
旅行	男
ゲーム	男
ゲーム	女
旅行	男
ゴルフ	男
山登り	男
手芸	女
ゴルフ	男
アロマ	女
旅行	女
ライブ	女

辞書が小さい場合は直接正規表現で。「名前付き捕捉」[2014-08-07-1]が便利。

perl -F"\t" -anle '
$F[1]=~s/^((?<Man>男)|(?<Woman>女))$/(keys%+)[0]/e;
print join"\t",@F
' sample.txt
旅行    Man
ゲーム  Man
ゲーム  Woman
旅行    Man
ゴルフ  Man
...
perl -F"\t" -anle '
$F[0]=~s/^((?<Travel>旅行)|(?<Game>ゲーム)|(?<Golf>ゴルフ))$/(keys%+)[0]/e;
print join"\t",@F
' sample.txt
Travel  男
Game    男
Game    女
Travel  男
Golf    男
...

辞書が大きい場合、というか辞書を別ファイルにする場合はハッシュに読み込んでから。

cat sample-dic.txt (辞書ファイル, TSV)
旅行    Travel
ゲーム  Game
ゴルフ  Golf
男      Man
女      Woman
perl -F"\t" -anle '
BEGIN{open(F,shift);map{/^(.+)\t(.+)$/;$d{$1}=$2}<F>}
$F[0]=$d{$F[0]}||$F[0];
$F[1]=$d{$F[1]}||$F[1];
print join"\t",@F
' sample-dic.txt sample.txt
Travel  Man
Game    Man
Game    Woman
Travel  Man
Golf    Man
...

関連記事

- テキストから辞書にある文字列をすべて取り出す簡単なプログラム (Pure Perl)[2014-05-09-1]
- Perl ワンライナーで join する(辞書引き結果を行データに追加するときに便利)[2013-12-23-1]
- Perl の正規表現の「名前付き捕捉」がとても便利[2014-08-07-1]