JOIN(1plan9)

πŸ’– NAME πŸ’–

join β€” relational database operator πŸ’…βœ¨


πŸ¦‹ SYNOPSIS πŸ¦‹

join [ options ] file1 file2

🌸 DESCRIPTION 🌸

okay so bestie, join is literally the moment two files become one. It forms, on the standard output, a join of the two relations specified by the lines of file1 and file2. And about the file-name thing β€” the page's own wording here is a lil cursed, so I'm just quoting it verbatim: "If one of the file names is the standard input is used." 🫢 you get the vibe.

file1 and file2 must be sorted in increasing ASCII collating sequence on the fields they're gonna be joined on β€” normally the first field in each line. not optional, no cap, if they're not sorted it's over for you 😭

There is one line in the output for each pair of lines in file1 and file2 that have identical join fields. That output line normally goes: the common field first, then the rest of the line from file1, then the rest of the line from file2. it's giving very organized, very demure πŸŽ€

Input fields are normally separated by spaces or tabs; output fields by space. When that's the case, multiple separators count as one, and leading separators are just discarded. bye πŸ’¨

The following options are recognized, with POSIX syntax. πŸ‘‘

  • -a n β€” in addition to the normal output, produce a line for each unpairable line in file n, where n is 1 or 2.
  • -v n β€” like -a, except it omits output for paired lines. (so: only the sad lonely unpaired ones πŸ’”)
  • -e s β€” replace empty output fields by the string s.
  • -1 m
  • -2 m β€” join on the mth field of file1 or file2.
  • -jn m β€” the archaic equivalent for -n m.
  • -ofields β€” each output line comprises the designated fields. The comma-separated field designators are either 0, meaning the join field, or have the form n.m, where n is a file number and m is a field number. Archaic usage allows separate arguments for field designators.
  • -tc β€” use character c as the only separator (tab character) on input and output. Every appearance of c in a line is significant.

πŸŽ€ EXAMPLES πŸŽ€

sort /etc/passwd | join -t: -1 1 -a 1 -e "" - bdays

Add birthdays to the /etc/passwd file, leaving unknown birthdays empty. The layout of /adm/users is given in passwd(5); bdays contains sorted lines like

tr : ' ' </etc/passwd | sort -k 3 3 >temp
join -1 3 -2 3 -o 1.1,2.1 temp temp | awk '$1 < $2'

Print all pairs of users with identical userids. πŸ‘―β€β™€οΈβœ¨


🌈 SOURCE 🌈

/src/cmd/join.c


🧚 SEE ALSO 🧚

sort(1), comm(1), awk(1)


πŸ’€ BUGS πŸ’€

With default field separation, the collating sequence is that of sort -b -ky,y; with -t, the sequence is that of sort -tx -ky,y. (yes, go look at sort(1), it's all connected bestie πŸ¦‹)

🚨 One of the files must be randomly accessible. 🚨 that one is not a drill, it's literally in the BUGS section.

and that's the whole page, mwah πŸ’‹ this was JOIN(1plan9) from the Plan 9 manual, straight out of /src/cmd/join.c β€” go sort something and slay πŸ‘‘πŸ’œ

πŸ“¦ where this page comes from