Reformate o exemplo original para facilitar a leitura:
join -a1 -e "NoMatch" \
<(awk -F ' ' '{print $0}' file1.txt |tail -n +2|sort -k1,1) \
<(cat file2 | sort -k1,1)
Todos os problemas estão com o processamento do arquivo2 e com as opções join
.
- o arquivo2 é classificado no campo 1, deve ser o campo 2.
- Nenhuma opção
-t '<tab>'
parajoin
, o arquivo2 é delimitado por tabulações. - Ausente da opção
join
para ingressar no campo 2 do arquivo2. - Mesmo com o campo
join
correto para o arquivo2, a saída padrão imprime o campo de união primeiro, portanto, é necessário especificar a opção-o FORMAT
emjoin
. - o cabeçalho do arquivo2 não é removido.
- Não causando problemas, mas processamento desnecessário:
tail
é desnecessário no arquivo1 porqueawk
pode pular a primeira linha. - Opção
-F ' '
desnecessária paraawk
.
Corrigir esses problemas gera isso:
#!/bin/bash
head -1 file2
join -t ' ' -2 2 -a 1 -e NoMatch -o 2.1,2.2,2.3 \
<(awk 'NR==1{next} {print $0}' file1.txt | sort) \
<(tail -n +2 file2 | sort -k2)
Que produz a seguinte saída delimitada por tabulação:
value ID1 ID2
1 a aaaa1
1 a aaaa2
1 b bbbb1
1 b bbbb2
1 b bbbb3
NoMatch NoMatch NoMatch
1 d aaaa4