test script: cat >/tmp/f1 <<'!' a c ! cat >/tmp/f2 <<'!' b c ! fn r { echo $* $* } r comm /tmp/f1 /tmp/f2 r comm -1 /tmp/f1 /tmp/f2 r comm -2 /tmp/f1 /tmp/f2 r comm -3 /tmp/f1 /tmp/f2 r comm -23 /tmp/f1 /tmp/f2 r comm -12 /tmp/f1 /tmp/f2 before: term% r comm /tmp/f1 /tmp/f2 comm /tmp/f1 /tmp/f2 a b c term% r comm -1 /tmp/f1 /tmp/f2 comm -1 /tmp/f1 /tmp/f2 b c term% r comm -2 /tmp/f1 /tmp/f2 comm -2 /tmp/f1 /tmp/f2 a c term% r comm -3 /tmp/f1 /tmp/f2 comm -3 /tmp/f1 /tmp/f2 a b term% r comm -23 /tmp/f1 /tmp/f2 comm -23 /tmp/f1 /tmp/f2 a term% r comm -12 /tmp/f1 /tmp/f2 comm -12 /tmp/f1 /tmp/f2 c note the empty columns in comm -1, comm -2, and comm -12: there is one tab too many. it's an easy fix. i noticed only later that the plan 9 command was essentially the ancient unix one, and a diff against that shows that indeed the l = 1 -> l = 2 was a change in going to plan 9, which dented it. after: doppio% r comm /tmp/f1 /tmp/f2 comm /tmp/f1 /tmp/f2 a b c doppio% r comm -1 /tmp/f1 /tmp/f2 comm -1 /tmp/f1 /tmp/f2 b c doppio% r comm -2 /tmp/f1 /tmp/f2 comm -2 /tmp/f1 /tmp/f2 a c doppio% r comm -3 /tmp/f1 /tmp/f2 comm -3 /tmp/f1 /tmp/f2 a b doppio% r comm -23 /tmp/f1 /tmp/f2 comm -23 /tmp/f1 /tmp/f2 a doppio% r comm -12 /tmp/f1 /tmp/f2 comm -12 /tmp/f1 /tmp/f2 c it now correctly suppresses columns. Reference: /n/sources/patch/applied/commfix Date: Tue Aug 31 21:22:37 CES 2004 --- /sys/src/cmd/comm.c Tue Aug 31 21:22:37 2004 +++ /sys/src/cmd/comm.c Tue Aug 31 21:22:37 2004 @@ -26,7 +26,7 @@ ldr[0] = ""; ldr[1] = "\t"; ldr[2] = "\t\t"; - l = 2; + l = 1; ARGBEGIN{ case '1': if(!one) {