Display two files side by side
You can use pr
to do this, using the -m
flag to merge the files, one per column, and -t
to omit headers, eg.
pr -m -t one.txt two.txt
outputs:
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
See Also:
- Print command result side by side
- Combine text files column-wise
To expand a bit on @Hasturkun's answer: by default pr
uses only 72 columns for its output, but it's relatively easy to make it use all available columns of your terminal window:
pr -w $COLUMNS -m -t one.txt two.txt
Most shell's will store (and update) your terminal's screenwidth in the $COLUMNS
environment variable, so we're just passing that value on to pr
to use for its output's width setting.
This also answers @Matt's question:
Is there a way for pr to auto-detect screen width?
So, no: pr
itself can't detect the screenwidth, but we're helping out a bit by passing in the terminal's width via the -w
option.
If you know the input files have no tabs, then using expand
simplifies @oyss's answer:
paste one.txt two.txt | expand --tabs=50
If there could be tabs in the input files, you can always expand first:
paste <(expand one.txt) <(expand two.txt) | expand --tabs=50
paste one.txt two.txt | awk -F'\t' '{
if (length($1)>max1) {max1=length($1)};
col1[NR] = $1; col2[NR] = $2 }
END {for (i = 1; i<=NR; i++) {printf ("%-*s %s\n", max1, col1[i], col2[i])}
}'
Using *
in a format specification allows you to supply the field length dynamically.
There is a sed
way:
f1width=$(wc -L <one.txt)
f1blank="$(printf "%${f1width}s" "")"
paste one.txt two.txt |
sed "
s/^\(.*\)\t/\1$f1blank\t/;
s/^\(.\{$f1width\}\) *\t/\1 /;
"
Under bash, you could use printf -v
:
f1width=$(wc -L <one.txt)
printf -v f1blank "%${f1width}s"
paste one.txt two.txt |
sed "s/^\(.*\)\t/\1$f1blank\t/;
s/^\(.\{$f1width\}\) *\t/\1 /;"
(Of course @Hasturkun 's solution pr
is the most accurate!):
Advantage of sed
over pr
You can finely choose separation width and or separators:
f1width=$(wc -L <one.txt)
(( f1width += 4 )) # Adding 4 spaces
printf -v f1blank "%${f1width}s"
paste one.txt two.txt |
sed "s/^\(.*\)\t/\1$f1blank\t/;
s/^\(.\{$f1width\}\) *\t/\1 /;"
Or, for sample, to mark lines containing line
:
f1width=$(wc -L <one.txt)
printf -v f1blank "%${f1width}s"
paste one.txt two.txt |
sed "s/^\(.*\)\t/\1$f1blank\t/;
/line/{s/^\(.\{$f1width\}\) *\t/\1 |ln| /;ba};
s/^\(.\{$f1width\}\) *\t/\1 | | /;:a"
will render:
apple | | The quick brown fox..
pear | | foo
longer line than the last two |ln| bar
last line |ln| linux
| |
|ln| skipped a line