How to run 'join' command for multiple files (of 2 types) in a folder

I have two types of files for a gene in a folder

File 1: FOS.tf.txt

ABL2
ACTN4
ERCC4
EZR
FAS
FMO4


File 2: FOS.tt.txt

ABL2
CASP9
CCK
DDIT3
ERCC4
EZR
FAS
FMO4


After running command

join FOS.tf.txt FOS.tt.txt > FOS_final.txt


I got output file: FOS_final.txt

ABL2
ERCC4
EZR
FAS
FMO4


My question is that I have these two type of files (tf and tt) for 605 genes in a folder and I want to run join command together for all my genes and get 605 output files.

If all of your .tf.txt and .tt.txt files are in the same directory, the following command should work.
for tffile in $(ls *.tf.txt) do prefix=$(basename $tffile .tf.txt) join${prefix}.tf.txt ${prefix}.tt.txt >${prefix}_final.txt

• The basename call can be avoided by anchoring a regex with parameter expansion like so: join ${tffile}${tffile/%.tf.txt/.tt.txt} > ${tffile/%.tf.txt/_final.txt} – Ram RS Jul 10 '19 at 20:24 • @RamRS Cool! I guess it's up to the individual to decide which ugly solution is less ugly! :-) – Daniel Standage Jul 11 '19 at 13:16 • Indeed. I wonder if $() is more performant than ${//}. – Ram RS Jul 11 '19 at 14:14 • @ Ram RS: I am getting this error${tffile/%.tf.txt/_final.txt}: ambiguous redirect – Riya Jul 11 '19 at 18:29