joinコマンドの出力をタブ区切りに

joinというUNIXコマンドは、2つのファイルの同じ値のある行をjoinして、一行にまとめてくれるコマンド。

join -j 1 file1 file2

でタブ区切りテキストのfile1とfile2の一番左側のカラムの値が同じ行が結合されて出力される。

このコマンドのやってくれる事自体は大変便利なのであるが、デフォルトではその後の出力はスペース区切りとなり、ちょっと不便だった。これをタブ区切りに変えるやり方を知ったので、こちらにも転記しておく。

join -j 1 -t "$(printf '\011')" file1 file2

結合する前のファイルはsortされていないといけない。そうなっていないと join: file1:7: is not sorted というエラーが出る。

sort -u file1 > file1s
sort -u file2 > file2s

のようにsortしたファイルで処理するようにする。-uオプションを付けることでsortしたうえに重複した行も除くように。

あとjoinするのに用いるword(キー)もユニークでなくてはならない。すなわち、二回以上出てきてはダメ。実は今日やっていたのはこちらの制約に引っかかり、結局joinコマンドでは無理ということで、しかたがなくPerlでスクリプトをかくという別の手段に。現実世界はなかなか大変。


Written by bonohu in misc on 水 06 4月 2016.