データを識別子 (ID) を使って結合する(マッチマージ)


複数のファイルにまたがっているデータを個人識別子 ID を使って結合する方法は大きなデータ処理ソフト (SAS, SPSS)では当たり前ですが,表計算ソフトでは少々やっかいで,私はその方法を知りません.そこでスクリプトを書いてみました.制限が多いのですが,これでも結構役に立っています.
# マッチマージ用
# 入力;	data2	:[file2]
#		大きい(削除対象のある)方のデータ2を適宜指定する
#	data1	:[filename]
# 両者ともマッチマージ用識別変数(ID)でソートされていなければならない
# data1 にあるIDが data2 に存在しないとエラーになる.すなわち,
# data1 は data2 の部分集合でなければならない.
# jgawk -f m_merge.awk [file2] [filename]

BEGIN	{
	FS=","				# CSVデータ用
	file2  = ARGV[1]
	split(ARGV[2], f, ".")
	outfile1 = f[1]".MRG"		# マッチ分 出力ファイル
	outfile2 = f[1]".NMG"		# 非マッチ分出力ファイル
	delete ARGV[1]
}
	{
	data1 = $0
	by1 = $2""			# マッチマージ用変数を指定
	nr = NR
	while (gl = getline < file2 > 0) {
		++i
		data2 = $0
		by2   = $2""		# マッチマージ用変数を指定
		if (by1 == by2) {
			print data1","data2 > outfile1
			break
		}
		else print data2 > outfile2
	}
	printf("%d,",i)
	if (gl == 0) {
		err_m = "ERROR!  No." nr " (ID = " by1 ") in the "\
			ARGV[2] " does not appear in the " file2
		err_m2 = "ERROR!  No." nr " (ID = " by1 ") in the "\
			ARGV[2] " このIDは次のファイルにありません." file2
		print ""
		print err_m
		print err_m2
		exit
	}
}
END	{ print "\n" "END" }

JGAWKホームページに戻る