Una dois arquivos, mantenha a ordem das chaves do primeiro arquivo e preencha valores ausentes com a string 'null'

1

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
    
por Ketan 24.05.2018 / 18:55

3 respostas

3
Solução

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
    
por 24.05.2018 / 19:03
1

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 .

    
por 24.05.2018 / 19:04
1

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
    
por 24.05.2018 / 20:54

Tags