join
+ sort
:
join -o1.1,1.2,1.3,2.2 -a1 -e"null" <(sort file1.txt) <(sort file2.txt)
A saída:
a 7 nah anau
b 0 blah null
c 5 bah bau
d 1 gah cau
e 0 hah null
Eu tenho dois arquivos - file1
e file2
que eu quero juntar, mas alguns campos estão faltando no segundo arquivo para o qual eu quero inserir a string 'null'. Um requisito é que as chaves estejam na mesma ordem que em file1
.
Os arquivos de entrada e o resultado de saída esperado são os seguintes:
file1.txt file2.txt
a 7 nah a anau
b 0 blah c bau
c 5 bah d cau
d 1 gah
e 0 hah
Resultado de saída esperado:
a 7 nah anau
b 0 blah null
c 5 bah bau
d 1 gah cau
e 0 hah null
Solução usando join
:
join file1.txt file2.txt -e null -o auto -a 1 2>/dev/null
Não está claro nas man pages, mas a opção -e
só funciona com -o
.
Consegui resolvê-lo com awk
. Descobri que nos meus dados, como no exemplo, o segundo campo de file1.txt
tem que ser 0 para estar faltando em file2.txt
- o que ajudou. O script é assim:
NR==FNR {
a[$1]=$2;next
}
$2!=0{
print $0,a[$1]
}
$2==0{
print $0,"null"
}
Invocação:
awk -f merge.awk file2.txt file1.txt