たつをの ChangeLog : 2015-09-01

よくやる作業についてメモ。
1行目がラベル行になっている、ものすごくカラムが多いTSVなどに。

cat sample-hd.txt
趣味	性別	年齢
旅行	男	28
ゲーム	男	21
ゲーム	女	23
旅行	男	31
ゴルフ	男	30
山登り	男	29
手芸	女	28
ゴルフ	男	34
アロマ	女	22
旅行	女	27
ライブ	女	2
perl -F"\t" -anle '
if($.==1){@l=@F;next}
print join"\t",map{"$l[$_]:$F[$_]"}(0..$#F);
' sample-hd.txt
趣味:旅行       性別:男 年齢:28
趣味:ゲーム     性別:男 年齢:21
趣味:ゲーム     性別:女 年齢:23
趣味:旅行       性別:男 年齢:31
趣味:ゴルフ     性別:男 年齢:30
趣味:山登り     性別:男 年齢:29
趣味:手芸       性別:女 年齢:28
趣味:ゴルフ     性別:男 年齢:34
趣味:アロマ     性別:女 年齢:22
趣味:旅行       性別:女 年齢:27
趣味:ライブ     性別:女 年齢:20
perl -F"\t" -anle '
if($.==1){@l=@F;next}
print join"",map{"$l[$_]:$F[$_]\n"}(0..$#F);
' sample-hd.txt
趣味:旅行
性別:男
年齢:28

趣味:ゲーム
性別:男
年齢:21

趣味:ゲーム
性別:女
年齢:23

趣味:旅行
性別:男
年齢:31
...

1行目無視して2行目以降のみ出す処理:
sed 1d sample-hd.txt
tail -n +2 sample-hd.txt
perl -ne 'print if$.>1' sample-hd.txt

よくやる作業についてメモ。
単語等の分布をざっくり見るときなど。

cat sample.txt (TSV)
旅行	男
ゲーム	男
ゲーム	女
旅行	男
ゴルフ	男
山登り	男
手芸	女
ゴルフ	男
アロマ	女
旅行	女
ライブ	女
perl -F"\t" -anle '
$h{$F[0]}{$F[1]}++;
$s{$F[0]}++;
END{
for$i(sort{$s{$b}<=>$s{$a}}keys%h){$r=$h{$i};
print join("\t",$i,$s{$i},map{"$_:$$r{$_}"}
sort{$$r{$b}<=>$$r{$a}||$a cmp $b}keys%$r)}
}
' sample.txt
旅行	3	男:2	女:1
ゴルフ	2	男:2
ゲーム	2	女:1	男:1
ライブ	1	女:1
山登り	1	男:1
手芸	1	女:1
アロマ	1	女:1
この記事に言及しているこのブログ内の記事

よくやる作業を簡単に試せるワンライナーとしてメモ。
機械学習ツールの入力フォーマットの業界標準っぽい形にする処理。

cat sample-lf.txt
政治 選挙:1 速報:1 外交:3 防衛:2
政治 選挙:2 予算:1 防衛:2 オスプレイ:2
スポーツ 野球:1 速報:1 スタジアム:3 エネルギー:1
スポーツ 移籍:2 速報:1 日本代表:1 サッカー:2 スタジアム:1
エンタメ 不倫:1 結婚:1 離婚:1
エンタメ 速報:1 離婚:1 ものまね:1 破綻:2
エンタメ 結婚:1 離婚:1 独立:1
科学 感染症:2 環境:2 医療:1 遺伝子:3
科学 エネルギー:1 環境:1 惑星:3 ニュートリノ:1
perl -nle '
BEGIN{$L=$F=1}
($k,@r)=split(/ /,$_);
$l{$k}=$L++if!$l{$k};
print join" ",$l{$k},
sort{$a<=>$b}map{/^(.+):(.+)$/;$f{$1}=$F++if!$f{$1};"$f{$1}:$2"}@r;
' sample-lf.txt
1 1:1 2:1 3:3 4:2
1 1:2 4:2 5:1 6:2
2 2:1 7:1 8:3 9:1
2 2:1 8:1 10:2 11:1 12:2
3 13:1 14:1 15:1
3 2:1 15:1 16:1 17:2
3 14:1 15:1 18:1
4 19:2 20:2 21:1 22:3
4 9:1 20:1 23:3 24:1
 

関連記事

- 単語リストを数値化(ID化)するPerlワンライナー[2014-02-04-3]
(辞書を作る)
この記事に言及しているこのブログ内の記事

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

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]

たつをの ChangeLog
Powered by chalow