program def fndmtch2
*! NJC 1.5.0 14 November 2000 
* NJC 1.4.0 29 February 2000 
	version 6.0 
	syntax varlist(min=2 max=2) [if] [in] /* 
	*/ , [ Generate(string) List by(varlist) MISS Count ] 
	
	local g `generate'
	if "`g'" == "" & "`list'" == "" { 
		di in r "must specify either generate( ) or list option" 
		exit 198 
	}
	else if "`g'" != "" { 
		confirm new variable `g' 
	} 
	else tempvar g 
	
	tokenize `varlist' 
	args var1 var2
	
	capture confirm string variable `var1' 
	local var1num = _rc != 0
	capture confirm string variable `var2' 
	local var2num = _rc != 0 
	if `var1num' != `var2num' { 
		local var1is = cond(`var1num',"numeric","string") 
		local var2is = cond(`var2num',"numeric","string") 
		di in r "`var1' is `var1is', `var2' is `var2is'" 
		exit 198 
	}	

	tempvar touse group BY 
	mark `touse' `if' `in'
	if "`miss'" == "" { 
		qui replace `touse' = 0 if missing(`var1') 
	}	
	qui gen byte `g' = cond(`touse',0,.) 

	if "`by'" == "" { 
		gen byte `BY' = 1 
	}	
	else { 
		sort `by' 
		qui by `by' : gen byte `BY' = _n == 1 
		qui replace `BY' = sum(`BY') 
	}	
	
	sort `touse' `var2' `BY' 
	qui by `touse' `var2' `BY' : gen byte `group' = _n == 1 & `touse' 
	qui replace `group' = sum(`group') 
	local ngrp = `group'[_N] 

	qui count if !`touse' 
	local j = r(N) + 1
	local i = 1 
	
	if "`count'" != "" { 
		qui while `i' <= `ngrp' {
			count /* 
		*/ if `var1' == `var2'[`j'] & `touse' & `BY' == `BY'[`j']  
			replace `g' = r(N) /* 
		*/ if `var1' == `var2'[`j'] & `touse' & `BY' == `BY'[`j'] 
			count if `group' == `i' 
			local j = `j' + r(N) 
			local i = `i' + 1 
		} 	
	} 
	else { 
		qui while `i' <= `ngrp' {
			replace `g' = 1 /* 
		*/ if `var1' == `var2'[`j'] & `touse' & `BY' == `BY'[`j'] 
			count if `group' == `i' 
			local j = `j' + r(N) 
			local i = `i' + 1 
		} 	
	}

	if "`list'" != "" {
		qui count if `g' > 0 & `g' < . 
		if r(N) > 0 { list `varlist' if `g' > 0 & `g' < . } 
	} 	
end