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 is1or2.-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 either0, meaning the join field, or have the formn.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 π§
π 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
- debian bookworm: 9base 1:6-13 Β· Lucent
- debian trixie: 9base 1:6-14 Β· Lucent
- ubuntu jammy: 9base 1:6-11 Β· Lucent
- ubuntu noble: 9base 1:6-14 Β· Lucent
- ubuntu questing: 9base 1:6-15
- ubuntu resolute: 9base 1:6-15build1 Β· Lucent
- ubuntu stonking: 9base 1:6-15build1 Β· Lucent
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms