joinコマンドで結合できるファイル数は2ファイルまで
joinコマンドの使い方
joinコマンドで結合できるファイル数は、2ファイルまでになります。
いくつかオプションが設定できますが、今回はオプション指定なしの書き方です。
下記の形式でjoinコマンドを記載することで、ファイル1とファイル2の先頭の列(一番左の列)をキーにして、ファイル1とファイル2を結合します。
○実行可能
join ファイル1 ファイル2
☓下記は実行不可
join ファイル1 ファイル2 ファイル3
joinコマンドのサンプルコード
例えば、下記のin.txtとin2.txtの2つのファイルがあるとします。
$ cat in.txt 5/6 55 5/7 99 5/8 43
$ cat in2.txt 5/6 15 5/7 79 5/8 83
下記のようにjoinコマンドを実行することで、in.txtとin2.txtの一番左の日付の列をキーにして、2つのファイルを結合します。
$ join in.txt in2.txt
下記が実行結果になります。
一番左の列は、in.txtとin2.txtの一番左の列、2列目はin.txtの2列目、3列目はin2.txtの2列目となって結合できているのが確認できます。
$ join in.txt in2.txt 5/6 55 15 5/7 99 79 5/8 43 83
joinコマンドで3ファイル以上結合するには?
シェルスクリプトで2ファイルずつ順に結合する
いくつか方法があると思いますので、あくまでも参考例になりますが、今回はシェルスクリプトで2ファイルずつ順に結合する方法をご紹介します。
3ファイル以上結合するサンプルコード
同ディレクトリに、下記のin.txtとin2.txtとin3.txtの3ファイルがあったとします。
$ cat in.txt 5/6 55 5/7 99 5/8 43
$ cat in2.txt 5/6 15 5/7 79 5/8 83
$ cat in3.txt 5/6 125 5/7 729 5/8 823
下記が、2ファイルずつ順にjoinコマンドで結合するサンプルコードになります。
$ cat sample.sh #!/bin/sh if [ -e ./join.txt ]; then rm ./join.txt fi for file in *.txt; do if [ -e ./join.txt ]; then join join.txt $file >join2.txt cp join2.txt join.txt else cp $file join.txt fi done
実行すると下記のように、3ファイルの一番左の列をキーに、3ファイルが結合されているのが確認できます。
$ ./sample.sh $ cat join2.txt 5/6 55 15 125 5/7 99 79 729 5/8 43 83 823
サンプルコードの解説
簡単にではありますが、シェルスクリプトの解説を順にしたいと思います。
まずは、for文で同ディレクトリにある3ファイルのファイル名を順に取得します。
for file in *.txt; do 〜省略〜 fi done
続いて、for文の中身についてです。
下記の部分で、順にjoinコマンドで2ファイルずつ結合しています。
join.txtとfor文で取得したファイルを結合しています。
結合結果をjoin2.txtに出力した後、join2.txtをjoin.txtにコピーして、次の結合に備えます。
if [ -e ./join.txt ]; then join join.txt $file >join2.txt cp join2.txt join.txt
下記は、最初のfor文の処理の一回目はjoin.txtがないため、for文で取得したファイルをjoin.txtにコピーして作成します。
else cp $file join.txt fi
説明が前後逆となってしまいましたが、下記は、join.txtが最初に存在した場合はfor文の動作がおかしくなるため、最初にrmコマンドで削除しています。
if [ -e ./join.txt ]; then rm ./join.txt fi