join

file1 with file2

join [options] file1 file2

For each pair of input lines with identical join fields, write a line to standard output.
The default join field is the first, delimited by whitespace.
When file1 or file2 is - read standard input.

-a filenum output all lines of filenum
-v filenum reverse, i.e. suppress joined output lines
-t char separator char is for input and output fields
Default: leading blanks separate fields and are ignored.
-i
--ignore-case
ignore case
-o auto|0|
filenum.field …
format for output line
auto: the first line of each file determines the number of fields output for each line.
Default format outputs the join field, the remaining fields from file1, the remaining fields from file2, all separated by char.
-1 fieldnum join on this field of file 1 (origin 1)
-2 fieldnum join on this field of file 2
-j fieldnum equivalent to -1 field -2 field'
--check-order check that inputs are correctly sorted
--nocheck-order do not check that the input is correctly sorted
--header first line in each file is field header, always output them .
-z
--zero-terminated
00 byte is used to end lines, not newline
-e empty replace missing input fields with EMPTY
--help join --help
Usage: join [OPTION]... FILE1 FILE2
For each pair of input lines with identical join fields, 
                    write a line to standard output.  
The default join field is the first, delimited by whitespace.  
When FILE1 or FILE2 (not both) is -, read standard input.

  -a FILENUM        also print unpairable lines from file FILENUM, where
                      FILENUM is 1 or 2, corresponding to FILE1 or FILE2
  -e EMPTY          replace missing input fields with EMPTY
  -i, --ignore-case  ignore differences in case when comparing fields
  -j FIELD          equivalent to '-1 FIELD -2 FIELD'
  -o FORMAT         obey FORMAT while constructing output line
  -t CHAR           use CHAR as input and output field separator
  -v FILENUM        like -a FILENUM, but suppress joined output lines
  -1 FIELD          join on this FIELD of file 1
  -2 FIELD          join on this FIELD of file 2
  --check-order     check that the input is correctly sorted, even
                      if all input lines are pairable
  --nocheck-order   do not check that the input is correctly sorted
  --header          treat the first line in each file as field headers,
                      print them without trying to pair them
  -z, --zero-terminated     end lines with 0 byte, not newline
      --help     display this help and exit
      --version  output version information and exit
--version output version information and exit

file1 and file2 must be sorted on the join fields.
Use sort -k 1b,1 if join has no options,
or use join -t '' if sort has no options.

If the input is not sorted and some lines cannot be joined, a warning message will be given.

Comparisons honor the rules specified by $LC_COLLATE.

Example
Seperator is the dot.

cat 0 
0
111tatc.222
0.bash.222.txt
00-2222222222.html
cat 00
0
111tatc.222
0.bash.222.txt
00-2222222222.html
join -e xxx   -t . 0 00
0
111tatc.222.222
0.bash.222.txt.bash.222.txt
00-2222222222.html.html

Useful for Log and System Analysis: Combining separate logs (e.g., matching a system health log to an IP address mapping log using the hostname as the key).
User and Inventory Management: Merging employee names with salary tables using an Employee ID, or matching product descriptions with prices using SKU numbers.
Report Generation: Aggregating metrics from different system tools into a single, comprehensive text or CSV report.

Default: Performs an Inner Join (only outputs lines where keys match in both files) using the first column as the key.join file1.txt file2.txt


names.txt:
101 Alice
102 Bob
103 Charlie

departments.txt
101 Engineering
102 Marketing
104 Sales

join names.txt departments.txt
Output (Inner Join):
101 Alice Engineering 
102 Bob Marketing 
=== occurs in both files.
    === taken from file1.
          === taken from file2.


keep lines from names.txt even if they don't have a matching department (Left Outer Join):
        join -a 1 names.txt departments.txt
Output:
101 Alice Engineering
102 Bob Marketing
103 Charlie     
Outer Join: Include unmatched rows (Left, Right, or Full Outer Joins).-a 1 (Left) / -a 2 (Right)