揮発性のメモ2

http://d.hatena.ne.jp/iww/

JOINコマンド

○○○=△△△ みたいな書式の2つのテキストa.txtb.txt○○○をキーにして1つにまとめたい。
どっちか片方にしかないものも出力して、両方にあるものはa.txtにあるほうを優先する。

join -t= -a1 -a2 a.txt b.txt | perl -ne 'print "$1\n" if(/^([^=]*+=[^=\n]*)/)' > c.txt

ただし、a.txtb.txtはソートしておく必要がある。


perl

cat b.txt a.txt | 
perl -ne 'if(/^([^=]+)=([^=\r\n]*)/){ $a{$1}=$2; }; END{ while(($k,$v)=each %a){ print "$k=$v\n";} }' 
> c.txt

あらかじめソートしとかなくていい分、こっちの方が楽で便利だ。


Man page of JOIN

-t 区切り文字。-t= なら = で区切る
-a1 1番目のファイル(a.txt)にしかないものも出力する
-a2 2番目のファイル(b.txt)にしかないものも出力する

優先したい方(この場合a.txt)を先に書く
a.txtb.txtは、それぞれ昇順にソートしておく。


これで、出力されるのは

a.txt
A=333
B=222
b.txt
A=111
C=444

のとき

A=333=111
B=222
C=444

になる。○○○=1番目の△△△=2番目の△△△
ということで、これをperl使って整形し、後ろをちょん切る。