Veja como fazer isso com join
e preservar a ordem de linha, cabeçalhos, rodapés, etc ...
join -1 2 -2 1 -a 1 -e 0 -o 1.1,1.2,1.3,1.4,1.5,2.2,2.3,2.4 \
<(sort -k2,2 <(nl -ba -nrz file1)) <(sort -k1,1 file2) | \
sort -k1,1n | cut -d\ -f2-
resultado:
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
test 200 500 -300 5 7 -2
exam 2 3 -1 0 7 -7
final 2 1 1 12 6 6
mail 4 2 2 0 0 0
TOTAL 208 506 -298 20 23 -3
Como funciona:
nl -ba -nrz file1
numera as linhas em file1
, a saída é então sort
ed no 2º campo; file2
também é sort
ed no 1º campo e os resultados são join
ed no 2º campo da 1ª entrada e 1º campo da 2ª entrada, substituindo campos de entrada faltantes com 0
:
000003 exam 2 3 -1 0 7 -7
000004 final 2 1 1 12 6 6
000005 mail 4 2 2 0 0 0
000001 TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
000002 test 200 500 -300 5 7 -2
000006 TOTAL 208 506 -298 20 23 -3
isso é classificado no primeiro campo com sort -k1,1n
para restaurar a ordem das linhas e, em seguida, cut -d\ -f2-
remove os números das linhas. Você poderia ainda embelezar com column
, por exemplo .... | column -t
:
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
test 200 500 -300 5 7 -2
exam 2 3 -1 0 7 -7
final 2 1 1 12 6 6
mail 4 2 2 0 0 0
TOTAL 208 506 -298 20 23 -3