辞書とマッチするカラムを別なものに置換するというよくやる作業について、簡単に試せるワンライナーとともにメモ。
辞書が小さい場合は直接正規表現で。「名前付き捕捉」[2014-08-07-1]が便利。
辞書が大きい場合、というか辞書を別ファイルにする場合はハッシュに読み込んでから。
- Perl ワンライナーで join する(辞書引き結果を行データに追加するときに便利)[2013-12-23-1]
- Perl の正規表現の「名前付き捕捉」がとても便利[2014-08-07-1]
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]
この記事に言及しているこのブログ内の記事