I notice that join doesn't warn about disorder
when there are no mismatches between the two files,
which is a good thing.
$ join -a1 <(printf '1\n0\n') <(printf '1\n0\n')
1
0
However it does warn if there is no input
in one of the files. I'm inclined to think that
the following should be treated as above?
$ join -a1 <(printf '1\n0\n') /dev/null
1
join: file 1 is not in sorted order
0
Doing that would allow one to use join to
extract fields with awk like blank handling,
and reordering support, without needing
to specify --nocheck-order.
$ printf "1 2 3\n" | join -a1 - /dev/null -o 1.3,1.1
3 1
cheers,
Pádraig.
diff --git a/src/join.c b/src/join.c
index afda5a1..8fcd47b 100644
--- a/src/join.c
+++ b/src/join.c
@@ -354,7 +354,7 @@ keycmp (struct line const *line1, struct line const *line2,
/* Check that successive input lines PREV and CURRENT from input file
WHATFILE are presented in order, unless the user may be relying on
- the GNU extension that input lines may be out of order if no input
+ the extension that input lines may be out of order if no input
lines are unpairable.
If the user specified --nocheck-order, the check is not made.
@@ -711,7 +711,7 @@ join (FILE *fp1, FILE *fp2)
seq2.count = 0;
}
- /* If the user did not specify --check-order, then we read the
+ /* If the user did not specify --nocheck-order, then we read the
tail ends of both inputs to verify that they are in order. We
skip the rest of the tail once we have issued a warning for that
file, unless we actually need to print the unpairable lines. */
@@ -726,7 +726,8 @@ join (FILE *fp1, FILE *fp2)
{
if (print_unpairables_1)
prjoin (seq1.lines[0], &uni_blank);
- seen_unpairable = true;
+ if (seq2.count)
+ seen_unpairable = true;
while (get_line (fp1, &line, 1))
{
if (print_unpairables_1)
@@ -740,7 +741,8 @@ join (FILE *fp1, FILE *fp2)
{
if (print_unpairables_2)
prjoin (&uni_blank, seq2.lines[0]);
- seen_unpairable = true;
+ if (seq1.count)
+ seen_unpairable = true;
while (get_line (fp2, &line, 2))
{
if (print_unpairables_2)