join(1): Fix field ordering for -v output

Per POSIX, join(1) (in modes other than -o) is a concatenation of selected
character fields.  The joined field is first, followed by fields in the
order they occurred in the input files.

Our join(1) utility previously handled this correctly for lines with a match
in the other file.  But it failed to order output fields correctly for
unmatched lines, printed in -a and -v modes.

A simple test case is:

$ touch a
$ echo "2 1" > b
$ join -v2 -2 2 a b
1 2

PR:		217711
Reported by:	alt.j2-4o4s2yon at yopmail.com
Sponsored by:	Dell EMC Isilon
This commit is contained in:
Conrad Meyer 2017-06-22 02:19:39 +00:00
parent 1f7d7cd76a
commit 3452510890
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=320210

View file

@ -467,9 +467,15 @@ outoneline(INPUT *F, LINE *lp)
else
outfield(lp, 0, 1);
}
else
else {
/*
* Output the join field, then the remaining fields.
*/
outfield(lp, F->joinf, 0);
for (cnt = 0; cnt < lp->fieldcnt; ++cnt)
outfield(lp, cnt, 0);
if (F->joinf != cnt)
outfield(lp, cnt, 0);
}
(void)printf("\n");
if (ferror(stdout))
err(1, "stdout");