スポンサーリンク

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

スポンサーリンク